String 卢阿语中阿拉伯字母的长度

String 卢阿语中阿拉伯字母的长度,string,unicode,lua,arabic,String,Unicode,Lua,Arabic,在Lua语言中,当我想得到一个阿拉伯字母的长度时(例如“ف”),答案将是2 例如 local letter = "ف" print( letter:len() ) 输出:2 使用(string.sub(a,b))时也会出现同样的问题。如果我想打印阿拉伯语单词的第一个字母,我不能说(string.sub(1,1) 前。 输出:ف 正如你所看到的,我把第二个论点(2)放在第(1)位是为了得到正确的答案。 如果我提出第一个论点1,答案将是: print( word_1:sub(1,1) ) 输

在Lua语言中,当我想得到一个阿拉伯字母的长度时(例如
“ف”
),答案将是
2

例如

local letter = "ف"
print( letter:len() )
输出:
2

使用
(string.sub(a,b))
时也会出现同样的问题。如果我想打印阿拉伯语单词的第一个字母,我不能说
(string.sub(1,1)

前。

输出:
ف

正如你所看到的,我把第二个论点(2)放在第(1)位是为了得到正确的答案。
如果我提出第一个论点1,答案将是:

print( word_1:sub(1,1) )
输出:
Ù

为什么Lua将一个阿拉伯字母的长度计算为两个

有没有办法得到正确的长度,即1?

Lua是8位干净的

换句话说,Lua字符串是一个字节序列,它在内部不支持Unicode。阿拉伯语字母
“ف”
有2个字节,因此Lua将其视为长度为2的字符串

您需要使用一种特殊的技巧来操作Unicode,例如,假设使用了UTF-8,您可以使用此代码段来计算字符串的长度(Referece:):


Lua是8位干净的,这就足以说明Lua支持Unicode。虽然没有额外的Unicode支持库,但支持的范围很小。 对于任何Unicode字符串,至少有4种方法可以测量它:代码单位、代码点、图形集簇。第四种方法是字节计数,它是代码单位的常量倍数,具体取决于使用的UTF。UTF-8:1 UTF16:2 UTF32:4。
因此,请清楚地考虑您在哪里需要这些措施。

Lua5.3现在发布了。它提供了一个基本的UTF-8库

可用于获取UTF-8字符串的长度:

print(utf8.len("ف"))
-- 1

它可能是Unicode表示法,也就是两个字节。阿拉伯语、希伯来语、汉字、普通话等不符合ASCII单字节/字符的思维方式,因为它只能有2^8=256个字符。阿拉伯语的含义不止于此。您可能应该指出,有指向Lua模块和库的链接,它们完成了大部分字符串在链接页面的底部()为您提供操作。可能会提到您计算的单位和假设:代码点(不是图形字符)和格式良好的输入。我同意这种方法,但字节数不是代码单元的常数倍。给定编码,代码单元的大小是常数。但代码单元的数量取决于编码的代码点(UTF-32除外,它总是1).Tom,请重新阅读您的评论。您的前两句话彼此之间存在严重分歧。我看不出您的最后一句话应该澄清或更正什么…代码单元中的字节数取决于编码:例如,1表示UTF-8,2表示UTF-16,4表示UTF-32。代码点中的代码单元数取决于编码d代码点:U+00000␀ 在UTF-8中有1个,在UTF-16中有1个,在UTF-32中有1个,在修改后的UTF-8中有2个;U+1D58B,所以,你同意字节数是代码单位的常数倍数。你在第一条评论的第一句中反驳了这一点,尽管你第一条评论的第二句反驳了你的矛盾。顺便说一句,这与每个代码点的代码单位无关,这是您在第一条评论中添加了一个非序列,现在对其进行扩展。回到您的回答,您可能是指“整数倍”而不是“常数倍”。无论如何,我建议您将“倍数”全部删除。字符串中的字节数(这就是您所描述的)不能通过乘法计算,只能通过迭代加法(UTF-32除外)。所以,我认为在你的好答案中,这是一个误导性的术语。
local _, count = string.gsub(unicode_string, "[^\128-\193]", "")
print(utf8.len("ف"))
-- 1