为什么同一套字符集会有不止一种编码方式
UTF-8、UTF-16和UTF-32都表示同一套底层的Unicode码点,但在存储效率和处理简便性之间做出了不同的取舍。UTF-8对以英文为主的文本更紧凑,在网络上占主导地位;而UTF-16被固化进了Windows、Java等较早的平台API中,这就是为什么两者都在广泛使用,而没有被彼此完全取代。
为什么一个表情符号有时其实"是"好几个码点
许多现代表情符号,比如带特定肤色的点赞手势,或是家庭表情符号,实际上是用一种叫做零宽连接符的特殊字符把多个码点连接起来的组合序列,在支持的软件里被渲染成一个字形。这就是为什么有些表情符号看起来一样,但底层的码点序列长度却不同。
常见问题
为什么一段文字的字符数有时和字节长度对不上?
因为像UTF-8这样的编码,每个字符所用的字节数是不固定的——一段只包含ASCII字母的文字,字符数和字节数是一致的,但一旦加入带重音符号的字母、中日韩文字或表情符号,字节长度增长的速度就会比看到的字符数量快。
通俗地说,什么是代理对?
这是UTF-16用来表示那些无法容纳进正常2字节单元的字符的一种方式,做法是把两个特殊的2字节单元组合起来当作一个整体使用。如果某段代码错误地把其中每一半当成独立的字符处理,就可能把一个表情符号或罕见字符从中间切断,导致显示错乱。