如何以UTF-8编码形式(PHP的mb_strlen(.., 'UTF-8')
等效形式)获取字符串的长度(不是字节数)?
我尝试了string.characters.count
,但它没有为表情符号等特定字符返回正确的长度。
示例:
let s = "✌️"
print(s.characters.count) // prints 2, but should print 3.
答案 0 :(得分:6)
您可以使用.utf8
属性访问字符串的UTF-8编码。使用count
来获取字符串中的UTF-8代码单元数:
let string = "\u{1f603}" // One of the smiley face emojis...
print(string.utf8.count) // prints "4"
根据您编辑的问题,您可能正在寻找的是用于对字符串进行编码的UnicodeScalar
个数。您可以使用unicodeScalars
属性访问该属性:
let s = "✌️"
print(s.unicodeScalars.count) // prints 3
每个人都感到困惑的原因是因为你的原始问题要求UTF-8编码形式的字符串长度。你真正想要的答案与UTF-8编码形式的字符串长度无关。
我认为您对Unicode“扩展字形集群”,Unicode代码点和可用于编码Unicode代码点的各种编码(如UTF-8)之间的区别感到困惑。
Swift中的Character
表示Unicode称为“扩展字形集群”。也就是说,它是一个单一的视觉角色,即使它由多个Unicode代码点组成。
Unicode代码点是单个语言符号,具有32位值。两个或多个Unicode代码点可以组合在一起以创建单个Character
。在Swift中,Unicode代码点由UnicodeScalar
类型表示。
当需要存储字符串或通过互联网发送字符串,或者将其转换为由字节表示的数据时,您必须决定如何对其进行编码。有各种编码,最常见的可能是UTF-8,它将字符串编码为一系列UInt8
值。
这只是三个概念之间差异的简短片段。这实际上是一个非常有趣的主题,如果你谷歌的一些条款,你会发现更多的好信息。
答案 1 :(得分:3)
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位数字(和名称),例如U + 0061用于LOWERCASE LATIN LETTER A(" a"),或U + 1F425用于FRONT-FACING BABY CHICK(" \ U0001f425")。 将Unicode字符串写入文本文件或其他存储时,这些unicode标量将以多种Unicode定义的格式之一进行编码。每种格式都以小块(称为代码单元)对字符串进行编码。这些包括UTF-8格式(将字符串编码为8位代码单元)和UTF-16格式(将字符串编码为16位代码单元)。
//从Apple Developer swift编程指南中复制