lua - string.byte 用于非 ascii 字符

问题描述 投票:0回答:2

我想将字符转换为数字代码,所以我尝试了 string.byte("å")。不过,对于这类字符,string.byte()的返回值似乎是195;

有什么方法可以获取非 ASCII 字符的数字代码,例如:?

à,á,â,ã,ä,å

我使用的是纯lua;

lua ascii non-ascii-characters
2个回答
5
投票

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
是逗号的编码。


0
投票

就像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   𐌸
© www.soinside.com 2019 - 2024. All rights reserved.