18

这是一个菜鸟问题,但我想知道为什么有不同的编码类型以及它们有什么区别(即 ASCII、utf-8 和 16、base64 等)

4

3 回答 3

17

我相信原因很多,但重点是:“您需要显示(编码)多少个字符?” 例如,如果你住在美国,你可以用 ASCII 走得很远。但在许多国家,我们需要 ä、å、ü 等字符。(如果 SO 仅是 ASCII 或您尝试将此文本读取为 ASCII 编码文本,您会在 ä、å 和 ü 的位置看到一些奇怪的字符。 ) 想想中国、日本、泰国和其他“异国情调”的国家。你可能在世界各地看到的照片上那些奇怪的数字可能只是字母,而不是漂亮的照片。

至于不同编码类型之间的区别,你需要看他们的规范。这是 UTF-8 的内容。

我不熟悉 UTF-16。以下是有关差异的一些信息。

当需要对二进制数据进行编码时,可以使用 Base64,这些二进制数据需要通过旨在处理文本数据的媒体进行存储和传输。如果您曾经使用 PHP 制作过某种电子邮件系统,那么您可能遇到过 Base64。

简而言之:支持将计算机程序的用户界面本地化为多种不同的语言。(编程语言仍然主要由 ASCII 编码中的字符组成,尽管例如在 Java 中可以在变量名中使用 UTF-8 编码,并且源代码文件通常存储为 ASCII 编码文本以外的其他内容,例如 UTF- 8 编码。)

简而言之,第 2 卷:总是当不同的人试图从特定的角度解决某个问题时(或者如果可能的话,甚至没有任何角度),结果可能会大不相同。引用 Joel 的 unicode 文章(链接如下):“因为字节最多可容纳 8 位,所以很多人开始思考,“天哪,我们可以将代码 128-255 用于我们自己的目的。”问题是,很多的人同时有这个想法,他们对从 128 到 255 的空间应该去哪里有自己的想法。”

感谢 Joachim 和 tchrist 提供的所有信息和讨论。这是我刚刚读到的两篇文章。(这两个链接都在我之前链接的页面上。)自从几年前我上次阅读 Joel 的文章以来,我已经忘记了大部分内容。我希望很好地介绍这个主题。马克戴维斯更深入一点。

于 2012-04-10T12:11:46.143 回答
10

有这么多变体的真正原因是Unicode 联盟来得太晚了。

在《开始》中,内存和存储非常昂贵,并且使用超过 8 位(有时仅 7 位)的内存来存储单个字符被认为是过多的。因此,几乎所有文本都使用每个字符 7 或 8 位存储。显然,8 位内存不足以表示所有人类语言的字符。仅代表一种语言中使用的大多数字符(对于某些语言甚至不可能)。因此,许多不同的字符编码旨在允许不同的语言(英语、德语、希腊语、俄语……)以每个字符 8 位对其文本进行编码。毕竟,单个文本文件(通常甚至是单个计算机系统)只会以一种语言使用,对吧?

这导致了一种情况,即没有单一商定的字符到任何类型的数字的映射。产生了许多不同的、不兼容的解决方案,并且不存在真正的中央控制。一些计算机系统使用ASCII,另一些使用EBCDIC(或更准确地说:EBCDIC 的众多变体之一)、ISO-8859-*(或其众多派生词之一)或现在几乎没有听说过的大量编码中的任何一种.

最后,Unicode Consortium 加紧了生成该单一映射的任务(以及许多有用但超出此答案范围的辅助数据)。

当 Unicode 联盟最终生成了一个相当全面的计算机可能表示的字符列表时(连同许多编码方案将它们编码为二进制数据,具体取决于您的具体需求),其他字符编码方案已经被广泛使用。这大大减慢了 Unicode 及其编码(UTF-8、UTF-16)的采用速度。

如今,如果您想表示文本,最好的办法是使用少数可以表示所有 Unicode 字符的编码之一。UTF-8 和 UTF-16 一起应该足以满足 99% 的所有用例,UTF-32 几乎涵盖了所有其他用例。需要明确的是:所有 UTF-* 编码都可以编码所有有效的 Unicode 字符。但由于 UTF-8 和 UTF-16 是可变宽度编码,它们可能并不适合所有用例。除非您需要能够与无法处理这些编码的遗留系统进行交互,否则现在几乎没有理由选择其他任何东西。

于 2012-04-10T12:59:12.967 回答
2

最主要的原因是能够展示更多的角色。当互联网还处于起步阶段时,没有人真正提前计划,以为有一天会有来自世界各地所有国家和所有语言的人使用它。所以一个小的字符集就足够了。逐渐发现它是有限的和以英语为中心的,因此需要更大的字符集。

于 2012-04-10T12:18:31.063 回答