【问题标题】:lua - string.byte for non ascii characterslua - 非 ascii 字符的 string.byte
【发布时间】:2014-08-03 03:28:29
【问题描述】:

我想将字符转换为数字代码,所以我尝试了 string.byte("å")。但是,对于这类字符,string.byte() 的返回值似乎是 195;

任何获取非ASCII字符的数字代码的方法,例如:?

à,á,â,ã,ä,å

我用的是纯lua;

【问题讨论】:

  • 其UTF-8编码为195,165(两个字节),可通过print(string.byte("å",1,-1))获取
  • 一个 Lua 字符串是一个计数的字节序列。在这种情况下,您放入这些字节中的内容在您和您的代码编辑器之间。
  • 你的问题有点不清楚。您已使用 UTF-8 编码保存脚本。 @YuHao 显示如何检索字符串中每个字符的可变字节数。但是,你真的想要字符的代码点吗?对于 Unicode 中的 å,它将是 229

标签: lua ascii non-ascii-characters


【解决方案1】:

Lua 认为字符串是一个字节序列,但一个 Unicode 字符可能包含多个字节。

假设字符串具有有效的 UTF-8 编码,您可以使用模式 "[\0-\x7F\xC2-\xF4][\x80-\xBF]*" 匹配单个 UTF-8 字节序列。 (在 Lua 5.1 中,使用"[%z\1-\127\194-\244][\128-\191]*"),然后获取它的数字代码:

local str = "à,á,â,ã,ä,å"

for c in str:gmatch("[\0-\x7F\xC2-\xF4][\x80-\xBF]*") do
    print(c:byte(1, -1))
end

输出:

195 160
44
195 161
44
195 162
44
195 163
44
195 164
44
195 165

请注意,44 是逗号的编码。

【讨论】:

  • Lua 将字符串定义为计数的字节序列。规范是这样定义的。如果你想要别的东西,你就选错了数据类型。
  • @Deduplicator 你的意思是:因为原生 Lua 字符串不支持 Unicode(还),那么不要尝试用 Lua 解决 Unicode 问题?如果解决方案如此简单,为什么不呢?
  • 我不是这个意思。我刚刚说过 Lua 文档不能误认为字符串是什么,因为它是负责定义的权威(至少对于 Lua 而言)。字节字符串不限于有效的 UTF-8(尽管任何 UTF-8 字符串都是有效的 Lua 字符串),也不只是 unicode 代码点或字素或字素簇的接口,这一事实不会改变任何东西。改第一句就行了顺便说一句:将 Lua 字符串更改为仅限于 Unicode 并强制执行 Unicode 语义会使其在许多情况下无用。
猜你喜欢
  • 1970-01-01
  • 2011-06-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 2012-01-23
相关资源
最近更新 更多