Обработка специальных символов в пути к файлу 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
,