我已经初始化了两个这样的字符常量:
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位,所以当我尝试记录simpleOfBytes for simpleCharacter使用UTF16StringEncoding它显示2个字节,而对于NSUTF8StringEncoding它显示1个字节.
我知道表情符号字符的表示方式不同,但为什么它总是将结果返回为4?
此外,如果我想迭代字符串中的每个字符,我将始终使用countElements,但那么确切地说何时使用lengthOfBytesUsingEncoding会有帮助吗?
请建议.
UTF编码的大小只是定义用于表示字符的最小字节数.但是,某些字符(如您使用的表情符号)需要表示超过2个字节.所有字符至少取决于编码中定义的最小值,并且最多可达到必要的字节数.
存在不同编码的原因有多种,但为了给您一个简单的示例:如果您知道要使用的所有字符都是2个字节或更少,则可以使用UTF-16编码的字符串,以便您可以立即跳转到任何索引的字符都像普通数组一样,因为它们统一存储在内存中.如果你把它编码为UTF-8,你将无法再安全地跳入数组,因为有些字符用1个字节表示,而其他字符用超过1个字节表示,使得特定索引在内存中的位置不清楚.