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

时间:2017-08-24 09:54:44

标签: ios swift string

我的下列文字用阿拉伯语写成,当我拨打text.characters.count时,它会返回298个字符而不是实数,即300。

案文:

  

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

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

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

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

2 个答案:

答案 0 :(得分:5)

获取unicode scalar计数应该会给您预期的结果:

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

myString.unicodeScalars.count // 300

Swift - Strings and Characters中所述:

  

在幕后,Swift的原生String类型是从 Unicode 构建的   标量值。 Unicode标量是一个唯一的21位数字   字符或修饰符,例如U + 0061,用于LATIN SMALL LETTER A(“a”),   或者U + 1F425用于前方婴儿小鸡(“”)。

<强>然而

无论您期望得到什么结果,将“harakat”(分隔符)计为“胖子”,“damma”,“kasra”作为分离的角色可能会给出错误的结果

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

let myString = "أولاً"

myString.characters.count // 4
myString.unicodeScalars.count // 5

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

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


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

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

答案 1 :(得分:2)

  

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

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

Swift的定义与大多数其他计算机语言有所不同,因为它将字符定义为"single extended grapheme cluster"

  

扩展字形集群是一个或多个Unicode标量的序列(当组合时)产生单个人类可读字符。

因此,在处理“字符数”时,重要的是要考虑实际想知道的内容:人类会将其视为一个字符 - 还是某些(计算机)编码?

如果没有正确的定义,就没有“正确”的答案。