Обработка специальных символов в пути к файлу lua (умлаутс)

У меня есть небольшая функция lua, чтобы проверить, существует ли файл

function file_exists( filePath )
    local handler = io.open( filePath )
    if handler then
        io.close( handler )
        return true
    end
    return false
end

Тем не менее, это всегда вернется false когда путь к файлу содержит специальные символы, такие как немецкие умляуты (äöü). Есть ли способ обойти это?

Большое спасибо!

2 ответа

Решение
utf8_to_cp1252 = (
   function(cp1252_description)
      local unicode_to_1252 = {}
      for code, unicode in cp1252_description:gmatch'\n0x(%x%x)%s+0x(%x+)' do
         unicode_to_1252[tonumber(unicode, 16)] = tonumber(code, 16)
      end
      local undefined = ('?'):byte()
      return
         function (utf8str)
            local pos, result = 1, {}
            while pos <= #utf8str do
               local code, size = utf8str:byte(pos, pos), 1
               if code >= 0xC0 and code < 0xFE then
                  local mask = 64
                  code = code - 128
                  repeat
                     local next_byte = utf8str:byte(pos+size, pos+size) or 0
                     if next_byte >= 0x80 and next_byte < 0xC0 then
                        code, size = (code - mask - 2) * 64 + next_byte, size+1
                     else
                        code, size = utf8str:byte(pos, pos), 1
                     end
                     mask = mask * 32
                  until code < mask
               end
               pos = pos + size
               table.insert(result, 
                  string.char(unicode_to_1252[code] or undefined))
            end
            return table.concat(result)
         end
   end
)[[
download 
http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
and insert the whole text here:

#
#    Name:     cp1252 to Unicode table
#    Unicode version: 2.0
#    Table version: 2.01
..................................
0xFD    0x00FD  #LATIN SMALL LETTER Y WITH ACUTE
0xFE    0x00FE  #LATIN SMALL LETTER THORN
0xFF    0x00FF  #LATIN SMALL LETTER Y WITH DIAERESIS
]]

Использование:

cp1252_filename = utf8_to_cp1252(your_utf8_filename)

Теперь вы можете использовать cp1252_filename вызывать io.open(), os.rename(), os.execute() и другие функции из стандартной библиотеки Lua.

Lua и его крошечная стандартная библиотека не зависят от платформы и не знают о правильных функциях Windows для чтения полных имен Unicode. Ты можешь использовать winapi модуль, чтобы получить некоторые специфичные для Windows функции для этой задачи. Обратите внимание, что на целевом диске необходимо включить создание коротких имен.

local handler = io.open( winapi.short_path(filePath) )
if handler then
    -- etc
end

Его также можно легко установить через LuaRocks: luarocks install winapi,

Другие вопросы по тегам