Unicode 和 ASCII 之间的确切区别是什么?
ASCII 共有 128 个字符(扩展集中为 256 个)。
Unicode 字符是否有任何大小规范?
ASCII 定义了 128 个字符,映射到数字 0–127。Unicode 定义(少于)2 21 个字符,类似地,这些字符映射到数字 0–2 21(尽管当前并非所有数字都已分配,有些是保留的)。
Unicode 是 ASCII 的超集,数字 0-127 在 ASCII 中的含义与它们在 Unicode 中的含义相同。例如,数字 65 表示“拉丁文大写 'A'”。
由于 Unicode 字符通常不适合一个 8 位字节,因此有多种方法可以将 Unicode 字符存储在字节序列中,例如 UTF-32 和 UTF-8。
理解为什么首先创建 ASCII 和 Unicode 有助于我理解两者之间的区别。
ASCII,起源
如其他答案所述,ASCII 使用 7 位来表示一个字符。通过使用 7 位,我们最多可以有 2^7 (= 128) 个不同的组合*。这意味着我们最多可以表示 128 个字符。
等等,7位?但为什么不是 1 个字节(8 位)?
最后一位(第 8 位)用于避免错误作为奇偶校验位。这在几年前是相关的。
大多数 ASCII 字符是字母表的可打印字符,例如 abc、ABC、123、?&! 等。其他是控制字符,例如回车、换行、制表符等。
请参阅下面的 ASCII 中一些字符的二进制表示:
0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)
在此处查看完整的 ASCII 表。
ASCII 仅用于英语。
什么?为什么只有英文?那里有这么多语言!
因为当时计算机产业的中心在美国。因此,它们不需要支持重音符号或其他标记,例如 á、ü、ç、ñ 等(也称为变音符号)。
ASCII 扩展
一些聪明的人开始使用第 8 位(用于奇偶校验的位)来编码更多字符以支持他们的语言(例如,支持法语中的“é”)。只需使用一个额外的位,原始 ASCII 表的大小就会增加一倍,以映射多达 256 个字符(2^8 = 256 个字符)。而不是像以前那样的 2^7 (128)。
10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)
这个“ASCII 扩展至 8 位而不是以前的 7 位”的名称可以简称为“扩展 ASCII”或“8 位 ASCII”。
正如@Tom在下面的评论中指出的那样,没有“扩展 ASCII ”之类的东西,但这是引用这个 8 位技巧的简单方法。8 位 ASCII 表有许多变体,例如ISO 8859-1,也称为 ISO Latin-1。
Unicode,崛起
ASCII Extended 解决了基于拉丁字母的语言的问题......其他需要完全不同的字母的语言呢?希腊语?俄语?中国人之类的?
我们需要一个全新的字符集……这就是 Unicode 背后的原因。Unicode 不包含每种语言的每个字符,但它肯定包含大量字符(请参阅此表)。
您不能将文本作为“Unicode”保存到硬盘。Unicode 是文本的抽象表示。您需要“编码”这个抽象表示。这就是编码发挥作用的地方。
编码:UTF-8 vs UTF-16 vs UTF-32
这个答案在解释基础知识方面做得很好:
UTF-8 对前 128 个字符使用 ASCII 集。这很方便,因为这意味着 ASCII 文本在 UTF-8 中也有效。
助记符:
笔记:
为什么是 2^7?
这对某些人来说是显而易见的,但以防万一。我们有七个可用的插槽,填充 0 或 1(二进制代码)。每个都可以有两种组合。如果我们有 7 个点,我们就有 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2^7 = 128 种组合。把它想象成一个有七个轮子的密码锁,每个轮子只有两个数字。
资料来源:维基百科、这篇很棒的博客文章和我最初发布此摘要的Mocki.co 。
ASCII 有 128 个代码点,从 0 到 127。它可以容纳在单个 8 位字节中,值 128 到 255 往往用于其他字符。使用不兼容的选择,导致代码页灾难。假设或猜测另一个代码页的程序无法正确读取在一个代码页中编码的文本。
Unicode 的出现就是为了解决这场灾难。版本 1 以 65536 个代码点开始,通常以 16 位编码。后来在版本 2 中扩展到 110 万个代码点。当前版本是 6.3,使用了 110 万个可用代码点中的 110,187 个。这不再适合 16 位。
当 v2 出现时,16 位编码很常见,例如被微软和苹果操作系统使用。以及像 Java 这样的语言运行时。v2 规范提出了一种将这 110 万个代码点映射到 16 位的方法。一种称为 UTF-16 的编码,一种可变长度编码,其中一个代码点可以占用 2 或 4 个字节。原始 v1 代码点占用 2 个字节,添加的代码点占用 4 个字节。
在 *nix 操作系统和工具中使用的另一种非常常见的可变长度编码是 UTF-8,代码点可以占用 1 到 4 个字节,原始 ASCII 代码占用 1 个字节,其余的占用更多。唯一的非可变长度编码是 UTF-32,一个代码点占用 4 个字节。不经常使用,因为它非常浪费。还有其他一些,如 UTF-1 和 UTF-7,被广泛忽略。
UTF-16/32 编码的一个问题是字节的顺序将取决于创建文本流的机器的字节序。所以添加 UTF-16BE、UTF-16LE、UTF-32BE 和 UTF-32LE。
拥有这些不同的编码选择在某种程度上会带来代码页灾难,以及程序员之间的激烈争论,哪种 UTF 选择是“最好的”。它们与操作系统默认值的关联几乎划清了界限。一种对策是定义 BOM、字节顺序标记、文本流开头的特殊代码点(U+FEFF,零宽度空间),指示如何对流的其余部分进行编码。它指示 UTF 编码和字节顺序,对文本渲染引擎是中性的。不幸的是,它是可选的,许多程序员声称他们有权省略它,所以事故仍然很常见。
ASCII 有 128 个码位,分配给图形字符和控制字符(控制码)。
Unicode 有 1,114,112 个代码位置。其中大约 100,000 个目前已分配给字符,并且许多代码点已永久设为非字符(即从未用于对任何字符进行编码),并且大多数代码点尚未分配。
ASCII 和 Unicode 唯一的共同点是:1)它们是字符代码。2) Unicode的前128个码位已经定义为与ASCII中的含义相同,只是ASCII控制字符的码位只是定义为表示控制字符,名称与它们的ASCII名称相对应,但它们的含义是未在 Unicode 中定义。
然而,有时,Unicode 被描述为(即使在 Unicode 标准中!)为“宽 ASCII”。这是一个口号,主要是试图传达这样一种想法,即 Unicode 是一种与 ASCII 曾经相同的通用字符代码(尽管 ASCII 的字符库完全不足以普遍使用),这与使用不同的代码相反不同的系统和应用程序以及不同的语言。
Unicode 本身只定义字符的“逻辑大小”:每个字符都有一个特定范围内的代码编号。这些代码数字可以使用不同的传输编码来表示,并且在内部,在内存中,Unicode 字符通常使用每个字符一个或两个 16 位数量来表示,具体取决于字符范围,有时每个字符使用一个 32 位数量。
ASCII 和 Unicode 是两种字符编码。基本上,它们是关于如何用二进制表示差异字符的标准,以便它们可以在数字媒体中写入、存储、传输和读取。两者之间的主要区别在于它们对字符进行编码的方式以及它们用于每个字符的位数。ASCII 最初使用七位来编码每个字符。后来通过扩展 ASCII 将其增加到 8 个,以解决原始的明显不足。相比之下,Unicode 使用可变位编码程序,您可以在其中选择 32、16 和 8 位编码。使用更多位可以让您以更大的文件为代价使用更多字符,而更少的位给您有限的选择,但可以节省大量空间。使用更少的位(即
Unicode 成为问题的主要原因之一来自许多非标准的扩展 ASCII 程序。除非您使用 Microsoft 和大多数其他软件公司使用的流行页面,否则您可能会遇到字符显示为框的问题。Unicode 实际上消除了这个问题,因为所有字符代码点都是标准化的。
Unicode 的另一个主要优点是它最大程度地可以容纳大量字符。正因为如此,Unicode 目前包含大多数书面语言,并且仍有更多空间。这包括典型的从左到右的脚本,如英语,甚至是从右到左的脚本,如阿拉伯语。中文、日文和许多其他变体也在 Unicode 中表示。所以Unicode不会很快被取代。
为了保持与当时已经广泛使用的旧 ASCII 的兼容性,Unicode 的设计方式是前八位与最流行的 ASCII 页面相匹配。所以如果你用 Unicode 打开一个 ASCII 编码的文件,你仍然会得到文件中编码的正确字符。这促进了 Unicode 的采用,因为它减轻了采用新编码标准对那些已经使用 ASCII 的人的影响。
概括:
1.ASCII uses an 8-bit encoding while Unicode uses a variable bit encoding.
2.Unicode is standardized while ASCII isn’t.
3.Unicode represents most written languages in the world while ASCII does not.
4.ASCII has its equivalent within Unicode.
给定数字仅用于存储 1 个字符
ASCII 定义了 128 个字符,因为 Unicode 包含超过 120,000 个字符的曲目。
除了 UTF 如何是 ASCII 的超集之外,另一个需要了解的 ASCII 和 UTF 之间的区别在于磁盘文件编码和数据表示以及随机存储器中的存储。程序知道给定的数据应该被理解为 ASCII 或 UTF 字符串,方法是在数据的开头检测特殊的字节顺序标记代码,或者从程序员的意图中假设数据是文本,然后检查它是否存在表明它是文本的模式在一种或另一种文本编码中。
使用十六进制数据的常规前缀表示法0x
,基本的良好参考是 ASCII 文本以字节值开头0x00
以0x7F
表示可能的 ASCII 字符值之一。UTF 文本通常0xEF 0xBB 0xBF
以 UTF8 的字节开头。对于 UTF16,使用 start bytes0xFE 0xFF
或0xFF 0xFE
,文本字节的 endian-ness 顺序由开始字节的顺序指示。不在可能字节值的 ASCII 范围内的字节值的简单存在也表明数据可能是 UTF。
还有其他字节顺序标记使用不同的代码来指示数据应该被解释为以某种编码标准编码的文本。