获得UTF8string的长度

如何获得UTF-8编码forms(PHP的mb_strlen(.., 'UTF-8')等效的string长度(不是字节数)?

我尝试过string.characters.count但是它不会像表情符号那样返回正确的字符长度。

例:

 let s = "✌🏿️" print(s.characters.count) // prints 2, but should print 3. 

您可以使用.utf8属性访问string的UTF-8编码。 使用count来获取string中UTF-8代码单元的数量:

 let string = "\u{1f603}" // One of the smiley face emojis... print(string.utf8.count) // prints "4" 

根据您编辑的问题,您可能要查找的是用于对string进行编码的UnicodeScalar的数量。 你可以用unicodeScalars属性访问它:

 let s = "✌🏿️" print(s.unicodeScalars.count) // prints 3 

每个人都感到困惑的原因是你原来的问题要求UTF-8编码forms的string长度。 你真正想要的答案与UTF-8编码forms的string长度没有任何关系。

我认为你对Unicode“扩展字形集群”,Unicode代码点和可用于编码Unicode代码点的各种编码(如UTF-8)之间的区别感到困惑。

Swift中的Character表示Unicode称为“扩展字形群集”的字符。 也就是说,即使它是由多个Unicode代码点组成的,它也是一个单一的可视化字符。

一个Unicode代码点是一个单一的语言符号,被赋予一个32位的值。 两个或更多的Unicode代码点可以结合起来创build一个Character 。 在Swift中,Unicode代码点由UnicodeScalartypes表示。

当需要存储一个string,或者通过互联网发送,或者将其转换为以字节表示的数据时,您必须决定如何对其进行编码。 有各种各样的编码,最常见的可能是UTF-8,它将string编码为一系列UInt8值。

这只是三个概念之间区别的一个简短的片段。 这实际上是一个非常有趣的主题,如果你谷歌这些条款,你会发现更多的好消息。

 let str = "ačŘ" print("str has \(str.characters.count) characters") // 3 print("and \(str.utf8.count) bytes as encoded in UTF-8") // 5 

更新(根据您的笔记)

 let s = "✌🏿️" let arr:[UInt8] = [226, 156, 140, 240, 159, 143, 191, 239, 184, 143] var arrCchar = arr.map { (uint8) -> Int8 in Int8(bitPattern: uint8) } arrCchar += [0] // to be null terminated let str = String.fromCString(&arrCchar) print(str) // Optional("✌🏿️") s == str // TRUE !!!! 

按字符

 s.characters.forEach { (c) -> () in let str = String(c) print(str.utf8.map{$0}, "which represents character: ", c) str.unicodeScalars.forEach({ (u) -> () in print("composed from unicode scalar(s): ", u.debugDescription) }) } /* [226, 156, 140] which represents character: ✌ composed from unicode scalar(s): "\u{270C}" [240, 159, 143, 191, 239, 184, 143] which represents character: 🏿️ composed from unicode scalar(s): "\u{0001F3FF}" composed from unicode scalar(s): "\u{FE0F}" */ 

Unicode中的每个字符都可以用一个或多个unicode标量表示。 unicode标量是一个字符或修饰符的唯一21位数字(和名称),例如LOWERCASE LATIN LETTER A(“a”)的U + 0061,或者前面BABY CHICK的U + 1F425(“\ U0001f425 “)。 将Unicodestring写入文本文件或其他存储时,这些unicode标量将使用几种Unicode定义的格式之一进行编码。 每种格式都将string编码为称为代码单元的小块。 这些格式包括UTF-8格式(将string编码为8位代码单元)和UTF-16格式(将string编码为16位代码单元)。

//从Apple Developer快速编程指南复制