Swift:string.characters.count为阿拉伯字符串返回错误的数字

JAH*_*lia 7 string ios swift

我有以下用阿拉伯语写的文本,当我调用text.characters.count它时,它返回298个字符而不是实数,即300.

文本:

هنالكالعديدمنالأنواعالمتوفرةلنصوصلوريمإيبسوم,ولكنالغالبيةتمتعديلهابشكلماعبرإدخالبعضالنوادرأوالكلماتالعشوائيةإلىالنص.إنكنتتريدأنتستخدمنصلوريمإيبسومما,عليكأنتتحققأولاأنليسهناكأيكلماتأوعباراتمحرجةأوغيرلائقةمخبأةفيهذاالنص.بينماتعملجميعمولداتنصوصا

提到在文本之前和之后没有周围的空白区域.

utf8.characters.count也返回相同的错误号码.

如何在这样的字符串中获得正确数量的字符?

Ahm*_*d F 5

获取unicode标量计数应该会给出预期的结果:

let myString = "????? ?????? ?? ??????? ???????? ????? ????? ??????? ???? ???????? ?? ??????? ???? ?? ??? ????? ??? ??????? ?? ??????? ????????? ??? ????. ?? ??? ???? ?? ?????? ?? ????? ?????? ??? ???? ?? ????? ????? ?? ??? ???? ?? ????? ?? ?????? ????? ?? ??? ????? ????? ?? ??? ????. ????? ???? ???? ??????? ???? ?"

myString.unicodeScalars.count // 300
Run Code Online (Sandbox Code Playgroud)

正如Swift中所提到的- 字符串和字符:

在幕后,Swift的原生String类型是根据Unicode 标量值构建的.Unicode标量是字符或修饰符的唯一21位数字,例如U + 0061表示LATIN SMALL LETTER A("a"),或U + 1F425表示FRONT-FACING BABY CHICK("").

然而

无论您期望得到什么结果,将"harakat"(分隔符)计为"Fat-ha","damma","kasra"作为分离的角色可能会给出错误的结果.

例如:如果您尝试检查"أولا"字数,您会注意到:

let myString = "?????"

myString.characters.count // 4
myString.unicodeScalars.count // 5
Run Code Online (Sandbox Code Playgroud)

如您所见,除非您计算其unicodeScalars值,否则TanweenFat-ha字符会计为分隔字符.

正如你所提到的,似乎charactercountonline.com将"harakat"(分隔符)视为独立字符,这对于非阿拉伯语的人来说应该是合乎逻辑的,但这是错误的计算.


备注对于非阿拉伯语的观众:

"أولا"包含一个十进制分隔,被称为"脂肪hatan"或"Tanween脂肪-H",该分离器应该被计为一个分离的字符指的是阿拉伯语的语法; 使用它的目的是指出单词的拼写应该如何.对于说阿拉伯语的人来说,这个逻辑应该是显而易见的,"أولا"这个词包含四个字符,但与计数有关时包含计算机!