【问题标题】:What is the relationship between unicode/utf-8/utf-16 and my local encode GBK?unicode/utf-8/utf-16和我的本地编码GBK有什么关系?
【发布时间】:2013-08-27 21:39:08
【问题描述】:

我注意到我在 Windows(中文版)上的文本文件在移植到 Ubuntu 时出现乱码。 经过更多研究,我知道Windows CN版本的默认编码是GBK,而Ubuntu是utf-8,iconv可以进行编码转换,例如从GBK到utf-8:

iconv -f gbk -t utf-8 input.txt > output.txt

但我仍然对这些编码的关系感到困惑。这些是什么?它们有什么异同?

【问题讨论】:

    标签: encode


    【解决方案1】:

    首先它不是关于操作系统,而是关于你用来读取文件的程序。

    在纯 .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 的 Wikipedia 文章,中文字形 4E00-9FFF 的第一个也是最常见的范围在 UTF-8 中表示为 2 或 3 个字节,而在 UTF-16 中表示为2 个字节。因此,如果您要使用大量中文,UTF-16 可能会更有效。您还必须查看其他范围以查看每个字符使用了多少字节。

    为了可移植性,最好的选择是 UTF,因为 UTF 几乎可以表示任何可能的字符集,所以观看者更有可能被编程正确解码。 GBK的大小增益并没有那么大。

    【讨论】:

    • 我一直在阅读您的回答,感谢您给如此专家的回答。总结(请查看):Unicode 是一种通用的多语言编码; UTF 序列是计算机中 unicode 的特定表示; GBK 是一种不便携的中文专用编码器。
    • 我认为你的想法是对的。 Unicode 是多语言并将数字映射到字形。 UTF 是编码序列化 Unicode 数字的方法。 GBK 是可移植的,只是(非中国人)编写处理 UTF 的软件比 GBK 更有可能,因为他们可以编写一个处理任何语言而不仅仅是中文的单一软件。
    猜你喜欢
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2011-10-02
    • 2012-06-24
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多