2012-11-05 60 views
7

有什么办法用Lua提取UTF-8编码字符串的第一个字母?用Lua提取UTF-8字符串的第一个字母

Lua没有正确支持Unicode,所以string.sub("ÆØÅ", 2, 2)将返回"?"而不是"Ø"

是否有一个相对简单的UTF-8解析算法,我可以使用每字节的字节字节,唯一目的是获取字符串的第一个字母,无论是中文字符还是A?

或者是这种方式太复杂,需要一个巨大的图书馆等?

+0

“*简单的Unicode解析算法*”“Unicode”是什么样的*这种?它是UTF-8,UTF-16还是别的?什么是编码? –

+2

http://www.joelonsoftware.com/articles/Unicode.html阅读本文。请。 – Cubic

+1

这里还有一个[Lua用户页面](http://lua-users.org/wiki/LuaUnicode) –

回答

16

可以容易地提取由UTF-8编码的字符串的第一个字母为以下代码:

function firstLetter(str) 
    return str:match("[%z\1-\127\194-\244][\128-\191]*") 
end 

由于UTF-8代码点或者与一个字节开始从0至127,或与从字节194至244之后是一个或多个字节为128〜191

甚至可以迭代过UTF-8代码点以类似的方式:

for code in str:gmatch("[%z\1-\127\194-\244][\128-\191]*") do 
    print(code) 
end 

请注意,这两个示例都会为每个字母返回一个字符串值,而不是Unicode代码点数值。

+0

太棒了!这正是我正在寻找的答案。简短而精确。 – forthrin

+0

对于已经验证的数据而言,这是合理的,但您可能需要谨慎处理尚未使用的数据。 – bames53

2

Lua 5.3提供了一个UTF-8 library

您可以使用utf8.codes让每个代码点,然后用utf8.char来获得字符:

local str = "ÆØÅ" 
for _, c in utf8.codes(str) do 
    print(utf8.char(c)) 
end 

这也适用于:

local str = "ÆØÅ" 
for w in str:gmatch(utf8.charpattern) do 
    print(w) 
end 

其中utf8.charpattern只是字符串"[\0-\x7F\xC2-\xF4][\x80-\xBF]*"用于匹配一个UTF-8字节序列的模式。

相关问题