如果我需要以下Python值,即Unicode字符'0':
我该如何在Lua中定义它?
>>> 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组合箭头字符。
然而,由于没有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
对于一个更现代的答案,Lua 5.3现在有了utf8.char
:
接收零个或多个整数,将每个整数转换为其对应的UTF-8字节序列,并返回一个由所有这些序列连接而成的字符串。
尽管原生Lua不直接支持或处理Unicode,但它的字符串实际上是任意字节的缓冲区,按照惯例包含ASCII字符。由于字符串可以包含任何字节值,因此在原生字符串之上构建Unicode支持相对简单。如果字节缓冲区无法满足要求,还可以使用userdata
对象来保存任何内容,并添加适当的元表,赋予其创建、转换为所需编码、连接、迭代和其他所需方法。
有 Lua用户维基上的页面讨论了在Lua程序中处理Unicode的各种方法。
\u
格式吗? - Nicol Bolas