这是一个初学者的问题,但我想知道为什么会有不同的编码类型,以及它们之间的区别(例如ASCII,utf-8和16,base64等)。
这是一个初学者的问题,但我想知道为什么会有不同的编码类型,以及它们之间的区别(例如ASCII,utf-8和16,base64等)。
我相信原因有很多,但主要问题是:“您需要显示(编码)多少个字符?”例如,如果您住在美国,可以使用ASCII。但在许多国家,我们需要像ä、å、ü等字符。(如果SO仅支持ASCII编码或者您尝试将此文本作为ASCII编码的文本阅读,则在ä、å和ü的位置上会看到一些奇怪的字符。)还要考虑中国、日本、泰国和其他“异国情调”的国家。您可能在世界各地看到的照片上的奇怪符号可能只是字母,而不是漂亮的图片。
至于不同编码类型之间的区别,您需要查看它们的规范。这里是UTF-8的一些信息。
我不熟悉UTF-16。这里是一些关于它们之间差异的信息。
当需要编码二进制数据以在设计用于处理文本数据的介质上存储和传输时,使用Base64。如果您曾经使用PHP创建过某种类型的电子邮件系统,您可能已经遇到过Base64。
简而言之:支持计算机程序用户界面本地化到多种不同语言。(编程语言仍然主要由ASCII编码中的字符组成,虽然例如在Java中可以使用UTF-8编码来命名变量,并且源代码文件通常存储为其他编码的文本,例如UTF-8编码。)
简而言之(第二部分):当不同的人从特定的角度(甚至没有观点,如果可能的话)尝试解决某些问题时,结果可能会有很大的不同。Joel在他的unicode文章中引用了以下内容(下面有链接):“因为字节有多达八个位,许多人开始思考:‘天哪,我们可以使用代码128-255来达到我们自己的目的。'问题在于,许多人同时想到了这个主意,并且他们对128到255之间的空间中应该放什么有自己的想法。”
感谢Joachim和tchrist提供的所有信息和讨论。这里有两篇文章我刚读过。(链接都在我之前提供的那个页面上。)自几年前我最后一次阅读Joel的文章以来,我已经忘记了大部分内容。希望这是一个不错的主题介绍。Mark Davis深入探讨了这个话题。
最终,Unicode联盟站出来承担起了这个任务,制定了这个单一映射(以及大量的有用但超出本答案范围的辅助数据)。
当Unicode联盟最终制定了一个相当全面的计算机可能表示的字符列表(以及许多编码方案,根据您具体的需求将它们编码为二进制数据),其他字符编码方案已经被广泛使用。这极大地减缓了Unicode及其编码(UTF-8、UTF-16)的采用速度。
现在,如果您想表示文本,最好使用几种可以表示所有Unicode字符的编码之一。UTF-8和UTF-16结合起来应该足以满足99%的所有用例,UTF-32覆盖了几乎所有其他用例。并且要明确一点:所有UTF-*编码都可以编码所有有效的Unicode字符。但是,由于UTF-8和UTF-16是可变宽度编码,它们可能不适合所有用例。除非您需要与无法处理这些编码的旧系统进行交互,否则现在很少有理由选择其他编码。