C. *_*ker 4 string unicode lua utf-8 lua-patterns
我需要获取文本变量的第一个字符。我通过以下简单方法之一实现这一目标:
\n\nstring.sub(someText,1,1)\nRun Code Online (Sandbox Code Playgroud)\n\n或者
\n\nsomeText:sub(1,1)\nRun Code Online (Sandbox Code Playgroud)\n\n如果我执行以下操作,我希望得到'\xc3\xb1'第一封信。然而,这两种方法的结果sub都是'\xc3\x83'
local someText = '\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1'\nprint('Test whole: '..someText) \nprint('first char: '..someText:sub(1,1))\nprint('first char with .sub: '..string.sub(someText,1,1))\nRun Code Online (Sandbox Code Playgroud)\n\n以下是控制台的结果:
\n\n2014-03-02 09:08:47.959 Corona Simulator[1701:507] Test whole: \xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1\n2014-03-02 09:08:47.960 Corona Simulator[1701:507] first char: \xc3\x83\n2014-03-02 09:08:47.960 Corona Simulator[1701:507] first char with .sub: \xc3\x83\nRun Code Online (Sandbox Code Playgroud)\n\n该函数似乎string.sub()正在用 UTF-8 编码返回值。只是为了好玩,我尝试使用utf8_decode()Corona SDK 提供的功能。但它并不成功。模拟器表明该函数需要一个数字,但得到了nil却得到了。
我也在网上搜索了一下是否有其他人遇到过这个问题。我发现有大量关于 Lua、Corona、Unicode 和 UTF-8 的讨论,但我没有遇到任何可以解决这个特定问题的内容。
\nLua 字符串是 8 位干净的,这意味着 Lua 中的字符串是字节流。UTF-8 字符\xc3\xb1有多个字节,但someText:sub(1,1)仅返回第一个字节。
对于 UTF-8 编码,ASCII范围内的所有字符都具有与 ASCII 相同的表示形式,即小于 128 的单个字节。对于其他 CodePoints,是一个字节序列,其中第一个字节在 194-244 范围内,连续字节的范围是 128-191。
\n\n因此,您可以使用该模式".[\\128-\\191]*"来匹配单个 UTF-8 CodePoint(而不是 Grapheme):
for c in "\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1\xc3\xb1":gmatch(".[\\128-\\191]*") do -- pretend the first string is in NFC\n print(c)\nend\nRun Code Online (Sandbox Code Playgroud)\n\n输出:
\n\n\xc3\xb1\n\xc3\xb1\n\xc3\xb1\n\xc3\xb1\n\xc3\xb1\n\xc3\xb1\n\xc3\xb1\nRun Code Online (Sandbox Code Playgroud)\n