我注意到我在Windows上的文本文件(中文版),当移植到Ubuntu时,变成了乱码。
经过更多的研究,我知道Windows CN版本的默认编码是GBK,而Ubuntu上的默认编码是utf-8,iconv
可以进行编码转换,例如,从GBK到utf-8:
iconv -f gbk -t utf-8 input.txt > output.txt
但我仍然对这些编码的关系感到困惑。这些是什么?它们之间有什么相似之处和区别?
答案 0 :(得分:5)
首先,它不是关于操作系统,而是关于您用来读取文件的程序。
在裸.txt上,程序必须能够猜测编码,这并不总是可行,但可能有效。在html上,编码是作为元数据给出的,因此浏览器不需要这样做。
其次,你知道ASCII吗?你看到它是如何通过数字代表符号的吗?如果不是,这是你should learn now的第一件事。
接下来,您是否看到了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中,中文字形位于following ranges。然后你必须看看UTF-8和UTF-16如何有效地代表这些范围。
根据维基百科有关UTF-8和UTF-16的文章,中文字形4E00-9FFF的第一个也是最常见的范围在UTF-8中表示为2或3个字节,而在UTF-16中则表示为2个字节。因此,如果您打算使用大量中文,UTF-16可能会更有效率。您还必须查看其他范围以查看每个字符使用的字节数。
为了便于携带,最好的选择是UTF,因为UTF几乎可以代表任何可能的字符集,因此观众更有可能被编程为正确解码它。 GBK的大小增益并不大。