【发布时间】:2011-10-15 19:39:23
【问题描述】:
如果我需要以下 python 值,unicode char '0':
>>> unichr(0)
u'\x00'
如何在 Lua 中定义它?
【问题讨论】:
如果我需要以下 python 值,unicode char '0':
>>> unichr(0)
u'\x00'
如何在 Lua 中定义它?
【问题讨论】:
没有。
Lua 没有 Unicode 值的概念。 Lua 根本没有 Unicode 的概念。所有 Lua 字符串都是 8 位的“字符”序列,所有 Lua 字符串函数都会这样对待它们。 Lua 不将字符串视为具有任何 Unicode 编码。它们只是一个字节序列。
您可以在字符串中插入任意数字。例如:
"\065\066"
相当于:
"AB"
\ 符号后跟 3 位数字(或其中一个转义字符),必须小于或等于 255。Lua 完全能够处理嵌入了 \000 字符的字符串。
但您不能直接将 Unicode 代码点插入 Lua 字符串。您可以将代码点分解为 UTF-8 并使用上述机制将代码点插入字符串。例如:
"x\226\131\151"
这是x 字符,后跟Unicode combining above arrow character。
但由于没有 Lua 函数真正理解 UTF-8,因此您必须公开一些需要 UTF-8 字符串的函数才能使其在任何方面都有用。
【讨论】:
怎么样
function unichr(ord)
if ord == nil then return nil end
if ord < 32 then return string.format('\\x%02x', ord) end
if ord < 126 then return string.char(ord) end
if ord < 65539 then return string.format("\\u%04x", ord) end
if ord < 1114111 then return string.format("\\u%08x", ord) end
end
【讨论】:
\u 的十六进制数字吗?
虽然原生 Lua 不直接支持或处理 Unicode,但它的字符串实际上是任意字节的缓冲区,按照惯例可以保存 ASCII 字符。由于字符串可能包含任何字节值,因此在原生字符串之上构建对 Unicode 的支持相对简单。如果字节缓冲区被证明不够健壮,也可以使用userdata 对象来保存任何内容,并添加合适的元表,赋予它创建、转换为所需编码、连接、迭代的方法,以及其他任何需要的东西。
a page at the Lua User's Wiki 讨论了在 Lua 程序中处理 Unicode 的各种方法。
【讨论】:
对于更现代的答案,Lua 5.3 现在有 utf8.char:
接收零个或多个整数,将每个整数转换为其对应的 UTF-8 字节序列,并返回一个包含所有这些序列连接的字符串。
【讨论】: