默认情况下,UTF-16 编码是否处理数据压缩?

Is UTF-16 encoding handles data compression by default?

提问人:Youmate 提问时间:12/27/2022 更新时间:12/27/2022 访问量:60

问:

当我将id转换为data时,我有unicode char,

UTF 8 -> 大小:3 字节 数组:[224, 174, 164]

UTF 16 -> 大小:4 字节 数组:[2980]

看起来很简单:UTF8 每个代码占用 1 个字节,UTF16 每个代码占用 4 个字节。但是,如果我在 macOS 中使用 Swift 编程语言使用“தததத”,

let tamil = "தததத"
         
let utf8Data = tamil.data(using: .utf8)!
let utf16Data = tamil.data(using: .utf16)!

print("UTF 8 -> Size: \(utf8Data.count) bytes Array: \(tamil.utf8.map({$0}))")
print("UTF 16 -> Size: \(utf16Data.count) bytes Array: \(tamil.utf16.map({$0}))")

然后输出是

UTF 8 -> 大小:12 字节阵列:[224, 174, 164, 224, 174, 164, 224, 174, 164, 224, 174, 164]

UTF 16 -> 大小:10 字节阵列:[2980、2980、2980、2980]

“தததத” 的 UTF16 数据 => 4x4 = 16 字节。但它是 10 字节,数组中只有 4 个代码。为什么会这样?6 个字节去哪儿了?

SWIFT Unicode UTF-16 UTF

评论


答:

1赞 deceze 12/27/2022 #1

这些字符串的实际字节表示形式如下:

UTF-8:

e0ae a4e0 aea4 e0ae a4e0 aea4

UTF-16:

feff 0ba4 0ba4 0ba4 0ba4

UTF-8 表示形式是 4 倍。
UTF-16 表示形式是 4 1 前导 BOM 的倍数。
e0aea40ba4feff

UTF-16 文本应以 BOM 开头,但这只需要在字符串开头出现一次,而不是每个字符一次。