local lfs = require("lfs")
local function print_dir()
for f in lfs.dir("b:\\") do
print(f)
end
end
print("Current locale: " .. os.setlocale(nil, "ctype"))
os.execute("chcp")
print("Кракозябры")
print_dir()
os.setlocale("", "ctype")
print("Current locale: " .. os.setlocale(nil, "ctype"))
os.execute("chcp")
print("Нормальный текст")
print_dir()
require 'ex'
--[[
1251: А - Я а - п 192 - 239
866: А - Я а - п 128 - 175
1251: р-я 240 - 255
866: р-я 224 - 239
1251: Ё- 168 ё - 184
866: Ё- 240 ё - 241
]]
local function from1251_to866(s)
local str = ''
for i=1, string.len(s) do
local byte = s:byte(i)
local b = byte
if (byte >= 192 and byte <= 239) then
b = byte-64
elseif (byte >= 240 and byte <= 255 ) then
b = byte-16
elseif byte == 168 then b=240 --Ё
elseif byte == 184 then b=241 --ё
end
str = str .. string.char(b)
end
return str
end
local function CheckDir(curpath,d)
local fullname = (curpath.."\\"..d.name):gsub("\\$","")
print(from1251_to866(fullname))
for entry in os.dir(fullname) do
if entry["type"]=="directory" then CheckDir(fullname, entry) end
if entry["type"]=="file" then
print( from1251_to866(fullname .."\\" ..entry.name) )
end
end
end
-- тестируем :
local s = [[АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ абвгдеёжзиклмнопрстуфхцчшщъыьэюя 0123456789 qwertyQWERTY !@#$%^&*()_+]]
print(from1251_to866(s) )
local pathname = os.currentdir()
local init = { ["type"]="directory", name="" }
CheckDir( pathname, init )
使用 866 编码的控制台输出(DOS 模式):
АБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ абвгдеёжзиклмнопрстуфхцчшщъыьэюя 0123456789 qwertyQWERTY !@#$%^&*()_+
d:\Projects\Lua\tmp
d:\Projects\Lua\tmp\include2
d:\Projects\Lua\tmp\test.lua
d:\Projects\Lua\tmp\test.luac
d:\Projects\Lua\tmp\test2.lua
d:\Projects\Lua\tmp\test2.luac
d:\Projects\Lua\tmp\папка на русском
d:\Projects\Lua\tmp\папка на русском\inc_inc
d:\Projects\Lua\tmp\папка на русском\inc_inc\meta.lua
d:\Projects\Lua\tmp\папка на русском\meta.lua
测试用例:
如果你将它保存到一个 Win-1251 编码的文件中并在控制台中执行它,你会得到这个:
如您所见,在我们告诉 Lua 我们正在处理的语言环境之后(即文件的编码类型以及相应的字符串编码),该函数
print
做了一些“底层”工作并输出到控制台以所需的编码输出。魔术是这样的:至于 ZeroBrainStudio,必须将排序转换为 UTF-8,因为它将所有输入/输出视为 UTF-8。但是,例如,模块
lfs
以系统编码 (1251) 返回字符串,为了在 ZeroBrainStudio 控制台中获得可读的输出,必须使用一些外部库将字符串从 1251 手动转换为 UTF-8。尝试使用外部库ex 和转码函数1251->866遍历目录:
使用 866 编码的控制台输出(DOS 模式):