如何在Lua中表示Unicode字符

10
如果我需要以下Python值,即Unicode字符'0':
>>> unichr(0)
u'\x00'

我该如何在Lua中定义它?
4个回答

10

没有这样的概念。

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字符串的函数,才能使其在任何情况下都有用。


5
如何处理?
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格式吗? - Nicol Bolas
1
"Lua中表示单个字符的方式是什么?" - 实际上我需要Lua函数输出与等效的Python脚本相同,因为其中一个正在替换另一个。显然,这已经足够了。 - Tzury Bar Yochay

5

对于一个更现代的答案,Lua 5.3现在有了utf8.char

接收零个或多个整数,将每个整数转换为其对应的UTF-8字节序列,并返回一个由所有这些序列连接而成的字符串。


3

尽管原生Lua不直接支持或处理Unicode,但它的字符串实际上是任意字节的缓冲区,按照惯例包含ASCII字符。由于字符串可以包含任何字节值,因此在原生字符串之上构建Unicode支持相对简单。如果字节缓冲区无法满足要求,还可以使用userdata对象来保存任何内容,并添加适当的元表,赋予其创建、转换为所需编码、连接、迭代和其他所需方法。

Lua用户维基上的页面讨论了在Lua程序中处理Unicode的各种方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接