string - 表情符号字符 (😎) 与简单字符,lengthOfBytesUsingEncoding 的不同结果

标签 string swift

我已经像这样初始化了两个字符常量:

let emojiCharacter = "😎"
let simpleCharacter = "a"

我正在像这样打印 lengthOfBytesUsingEncoding 的结果:

println("\(emojiCharacter) countElements returns \(countElements(emojiCharacter))")
println("\(simpleCharacter) countElements returns \(countElements(simpleCharacter))")
println("\(emojiCharacter) UTF16StringEncoding lengthOfBytesUsingEncoding returns \(emojiCharacter.lengthOfBytesUsingEncoding(NSUTF16StringEncoding))")
println("\(simpleCharacter) UTF16StringEncoding lengthOfBytesUsingEncoding returns \(simpleCharacter.lengthOfBytesUsingEncoding(NSUTF16StringEncoding))")
println("\(emojiCharacter) NSUTF8StringEncoding lengthOfBytesUsingEncoding returns \(emojiCharacter.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))")
println("\(simpleCharacter) NSUTF8StringEncoding lengthOfBytesUsingEncoding returns \(simpleCharacter.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))")

结果如下:

😎 countElements returns 1
a countElements returns 1
😎 UTF16StringEncoding lengthOfBytesUsingEncoding returns 4
a UTF16StringEncoding lengthOfBytesUsingEncoding returns 2
😎 NSUTF8StringEncoding lengthOfBytesUsingEncoding returns 4
a NSUTF8StringEncoding lengthOfBytesUsingEncoding returns 1

我对结果感到困惑,因为根据我的理解,如果我们使用 UTF16StringEncoding 那么它会将每个字符视为 2 个字节或 16 位,如果我们使用 UTF8StringEncoding 那么它会将每个字符视为 1 个字节或 8 位,所以当我尝试使用 UTF16StringEncoding 记录 simpleCharacter 的 lengthOfBytes,它显示 2 个字节,对于 NSUTF8StringEncoding,它显示 1 个字节。

我知道表情符号字符的表示方式不同,但为什么它总是返回结果为 4?

此外,如果我想遍历字符串中的每个字符,我将始终使用 countElements,但究竟什么时候使用 lengthOfBytesUsingEncoding 会有帮助?

请提出建议。

最佳答案

UTF 编码的大小简单地定义了用于表示字符的最小 字节数。但是,某些字符(例如您使用的表情符号)需要超过 2 个字节才能表示。所有字符至少占用编码中定义的最小字节数,最多占用必要的字节数。

存在不同编码的原因有多种,但举个简单的例子:如果你知道你将要使用的所有字符都是 2 个字节或更少,你可以使用 UTF-16 编码的字符串,这样你就可以像普通数组一样立即跳转到任何索引处的字符,因为它们统一存储在内存中。如果您改为将其编码为 UTF-8,您将无法再安全地跳入数组,因为某些字符将以 1 个字节表示,而其他字符将以超过 1 个字节表示,从而使特定索引在内存中的位置不清楚。

关于string - 表情符号字符 (😎) 与简单字符,lengthOfBytesUsingEncoding 的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24175911/

相关文章:

python - 遍历 python 列表和字符串格式

python - 以 r 为前缀的字符串的拆分行为

c++ - 如何将 "std::vector<std::string>"转换为 "const char* array"?

string - Swift 字符串,字符连接加赋值

ios - 滚动后 UITableViewCell 中的 UIView 中的渐变发生变化

ios - 检测 AVPlayer 何时达到总播放时间的一定百分比?

swift - 使用 spritekit/skscene 调用 uiactivityviewcontroller

java - 如何生成随机字母数字字符串

ios - 我可以在 iOS 7 上运行的应用程序中使用 swift sdk 吗?

ios - Xcode Storyboard不显示场景