我想将字符转换为数字代码,所以我尝试了 string.byte("å")。不过,对于这类字符,string.byte()的返回值似乎是195;
有什么方法可以获取非 ASCII 字符的数字代码,例如:?
à,á,â,ã,ä,å
我使用的是纯lua;
Lua认为字符串是字节序列,但一个Unicode字符可能包含多个字节。
假设字符串具有有效的 UTF-8 编码,您可以使用模式
"[\0-\x7F\xC2-\xF4][\x80-\xBF]*"
来匹配单个 UTF-8 字节序列。 (Lua 5.1中使用"[%z\1-\127\194-\244][\128-\191]*"
),然后得到它的数字代码:
local str = "à,á,â,ã,ä,å"
for c in str:gmatch("[\0-\x7F\xC2-\xF4][\x80-\xBF]*") do
print(c:byte(1, -1))
end
输出:
195 160
44
195 161
44
195 162
44
195 163
44
195 164
44
195 165
请注意,
44
是逗号的编码。
就像string.byte(),但是对于unicode:
function utf8Byte(char)
local b1, b2 = char:byte(1, 2)
local b3, b4 = char:byte(3, 4)
if b1 < 20 then
return nil
elseif b1 < 128 then
-- b1 is less than 128, it's a single-byte character
return b1
elseif b1 < 194 then
return nil
elseif b1 < 224 then
return (b1 - 192) * 64 + (b2 - 128)
elseif b1 < 240 then
return (b1 - 192) * 64 + (b2 - 128)
elseif b1 < 245 then
return (b1 - 240) * 262144 + (b2 - 128) * 4096 + (b3 - 128) * 64 + (b4 - 128)
else
return nil
end
end
示例:
local unicodeChars = {"A", "~", "¡", "ÿ", "Ā", "Ȁ", "Ф", "ૐ", "⼈", "ff", "𐌸"}
for _, uChar in ipairs (unicodeChars) do
local index = utf8Byte (uChar)
print (index, uChar)
end
结果:
65 A
126 ~
161 ¡
255 ÿ
256 Ā
512 Ȁ
1060 Ф
2091 ૐ
2236 ⼈
3052 ff
66360 𐌸