答案 0 :(得分:0)
我最熟悉日语,但总的来说,对于任何需要更多字符而不是单个字节的语言,策略是相同的 - 你使用可变宽度多字节编码,其中一些字节被识别为开始“宽”字符并且ASCII保持不变。
在早期,所谓的“ASCII安全”编码很有用。这些只使用 7位(高位始终为0),因此它们与各种系统(包括硬件)配合使用,这些系统只需要控制字符即可在任何字节中设置高位。 ISO-2022-JP是其中之一,并且仍然经常在电子邮件中使用(主要在功能手机上)。
如果你不对它进行解码,这就是ISO-2022-JP的样子:
echo "日本語" | iconv -f utf8 -t iso2022jp | cat -v
^[$BF|K\8l^[(B
请注意,“test”不变,所有其他字符都是有效的ASCII; ^[
是ASCII转义字符。 (ISO-2022也有8位版本,但7位是最常用的版本。)
后来的可变宽度编码,如EUC,Shift-JIS和UTF-8都使用相同的原理,除了它们使用二进制(非ASCII)转义,因此任何多个的第一个字符字节字符具有高位设置(即,无符号字节值> 128)。 Wikipedia article for UTF-8有一个很好的表格,解释了UTF如何处理这个问题。就像旧版的ASCII安全编码一样,这些编码不会修改ASCII字符串。
还存在固定宽度多字节编码,但它们相对不常见。有人试图推广一种编码,它只使用了两个字节用于所有内容,称为“UCS-2”,但它最终没有足够的空间来容纳足够的字符,并且在20世纪90年代大部分被可变宽度的UTF-16所取代。 UTF-16(实际上是)Java和Javascript中使用的内部编码,但由于UCS-2的历史,有时像字符串长度这样的东西以奇怪的方式工作。
技术上固定宽度UTF-32存在,但它没有被广泛使用,我从未亲自在野外遇到它。