我注意到我在 Windows(中文版)上的文本文件在移植到 Ubuntu 时变成了乱码。经过更多研究,我知道Windows CN版本的默认编码是GBK,而Ubuntu是utf-8,并且iconv
可以进行编码转换,例如从GBK到utf-8:
iconv -f gbk -t utf-8 input.txt > output.txt
但是我仍然对这些编码的关系感到困惑。这些是什么?它们之间有什么相同点和不同点?
我注意到我在 Windows(中文版)上的文本文件在移植到 Ubuntu 时变成了乱码。经过更多研究,我知道Windows CN版本的默认编码是GBK,而Ubuntu是utf-8,并且iconv
可以进行编码转换,例如从GBK到utf-8:
iconv -f gbk -t utf-8 input.txt > output.txt
但是我仍然对这些编码的关系感到困惑。这些是什么?它们之间有什么相同点和不同点?
首先它不是关于操作系统,而是关于你用来读取文件的程序。
在裸 .txt 上,程序必须能够猜测编码,这并不总是可能的,但可能会起作用。在 html 上,编码是作为元数据给出的,所以浏览器不需要这样做。
第二,你知道ASCII吗?你看到它是如何通过数字来表示符号的吗?如果不是,这是你现在应该学习的第一件事。
接下来,你看到 Unicode 和 UTF-XXX 的区别了吗?你必须清楚,Unicode 只是数字(码点)到字形(符号,包括汉字、ASCII 字符、埃及字符等)的映射。
另一方面,UTF-XXX 表示,给定一串字节,它们代表哪些 Unicode 数字(代码点)。因此,UTF-8 和 UTF-16 是表示 Unicode 的不同有效方式。
正如您可能想象的那样,与 ASCII 不同,UTF 和 GBK 都必须允许每个字符超过一个字节,因为它们的字节数远远超过 256 个。
在 GBK 中,所有字符都被编码为 1 或 2 个字节。由于 GBK 专门用于中文,它平均使用比 UTF-XXX 更少的字节来表示给定的中文文本,而更多地用于其他语言。
在 UTF-8 和 16 中,每个字形的字节数是可变的,因此您必须查看中文码位使用了多少字节。
在 Unicode 中,中文字形在以下范围内。然后您必须查看 UTF-8 和 UTF-16 表示这些范围的效率。
根据关于 UTF-8 和 UTF-16 的 Wikipedia 文章,中文字形 4E00-9FFF 的第一个也是最常见的范围在 UTF-8 中表示为 2 或 3 个字节,而在 UTF-16 中表示为 2 个字节。因此,如果您要使用大量中文,UTF-16 可能会更有效。您还必须查看其他范围以查看每个字符使用了多少字节。
对于可移植性,最好的选择是 UTF,因为 UTF 几乎可以表示任何可能的字符集,所以观众更有可能被编程来正确解码它。GBK的大小增益并没有那么大。