我已经像这样初始化了两个字符常量:
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/