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



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

正文:

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

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

utf8.characters.count还返回相同的错误数字。

如何在给定这样的字符串的情况下获得正确数量的字符?

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

let myString = "هنالك العديد من الأنواع المتوفرة لنصوص لوريم إيبسوم، ولكن الغالبية تم تعديلها بشكل ما عبر إدخال بعض النوادر أو الكلمات العشوائية إلى النص. إن كنت تريد أن تستخدم نص لوريم إيبسوم ما، عليك أن تتحقق أولاً أن ليس هناك أي كلمات أو عبارات محرجة أو غير لائقة مخبأة في هذا النص. بينما تعمل جميع مولّدات نصوص ا"
myString.unicodeScalars.count // 300

如 Swift - 字符串和字符中所述:

在幕后,Swift 的原生字符串类型是从Unicode标量值构建的。Unicode 标量是 字符或修饰符,例如 U+0061 表示拉丁小写字母 A ("a"(, 或 U+1F425 表示前置婴儿小鸡 ("🐥(。

然而

无论您预期的结果是什么,将"harakat"(分隔符(如"Fat-ha"、"damma"、"kasra"计算为分离字符可能会给出错误的结果

例如:如果您尝试检查"أولاً"单词的计数,您会注意到:

let myString = "أولاً"
myString.characters.count // 4
myString.unicodeScalars.count // 5

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

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


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

单词"أولاً"包含一个小数分隔符,称为"Fat-hatan"或"Tanween Fat-h",此分隔符不应算作指阿拉伯语语法的分隔字符;使用它的目的是指示单词的拼写应该如何。这个逻辑对于讲阿拉伯语的人来说应该是显而易见的,"أولاً"这个词包含四个字符,但当它与计数有关时不是计算机!

[...

]当我调用text.characters.count时,它返回298个字符而不是实数,即300。

所有这些都归结为字符的定义(其中有几个(。

Swift 的定义与大多数其他计算机语言有些不同,因为它将字符定义为"单个扩展字形簇":

扩展字素簇是一个或多个 Unicode 标量的序列,这些标量(组合时(产生单个人类可读字符。

因此,在处理"字符数"时,重要的是要考虑真正想知道的内容:它是人类感知到的字符,还是与某些(计算机(编码有关?

没有正确的定义,就没有"正确"的答案。

最新更新