Unicode和ASCII的确切区别是什么?
ASCII共有128个字符(扩展集为256个)。
Unicode字符有大小规范吗?
Unicode和ASCII的确切区别是什么?
ASCII共有128个字符(扩展集为256个)。
Unicode字符有大小规范吗?
当前回答
ASCII有128个码位,分配给图形字符和控制字符(控制码)。
统一码有1114,112个码位。目前大约有10万个编码点被分配给了字符,许多编码点被永久地变成了非字符(即不再用于编码任何字符),大多数编码点还没有分配。
ASCII和Unicode唯一的共同点是:1)它们都是字符代码。2) Unicode的128个第一个码位已经定义为与ASCII相同的含义,只是ASCII控制字符的码位只是定义为表示控制字符,其名称对应于其ASCII名称,但其含义在Unicode中没有定义。
然而,有时Unicode被描述为“宽ASCII”(即使在Unicode标准中!)。这是一个口号,主要试图传达这样一种思想,即Unicode是一种通用字符代码,就像ASCII曾经是那样(尽管ASCII的字符库严重不足,无法实现通用),而不是在不同的系统和应用程序以及不同的语言中使用不同的代码。
Unicode本身只定义字符的“逻辑大小”:每个字符都有一个特定范围内的编码。这些编码可以使用不同的传输编码来表示,并且在内存内部,Unicode字符通常使用每个字符一个或两个16位数来表示,这取决于字符范围,有时每个字符使用一个32位数。
其他回答
ASCII定义128个字符,而Unicode包含超过120,000个字符。
ASCII定义了128个字符,对应于数字0-127。Unicode定义了(小于)221个字符,类似地,这些字符映射到数字0-221(尽管目前不是所有的数字都被分配了,有些是保留的)。
Unicode是ASCII的超集,数字0-127在ASCII中的含义与在Unicode中的含义相同。例如,数字65的意思是“拉丁大写字母‘A’”。
因为Unicode字符通常不适合一个8位字节,所以有许多方法将Unicode字符存储在字节序列中,例如UTF-32和UTF-8。
ASCII有128个码位,分配给图形字符和控制字符(控制码)。
统一码有1114,112个码位。目前大约有10万个编码点被分配给了字符,许多编码点被永久地变成了非字符(即不再用于编码任何字符),大多数编码点还没有分配。
ASCII和Unicode唯一的共同点是:1)它们都是字符代码。2) Unicode的128个第一个码位已经定义为与ASCII相同的含义,只是ASCII控制字符的码位只是定义为表示控制字符,其名称对应于其ASCII名称,但其含义在Unicode中没有定义。
然而,有时Unicode被描述为“宽ASCII”(即使在Unicode标准中!)。这是一个口号,主要试图传达这样一种思想,即Unicode是一种通用字符代码,就像ASCII曾经是那样(尽管ASCII的字符库严重不足,无法实现通用),而不是在不同的系统和应用程序以及不同的语言中使用不同的代码。
Unicode本身只定义字符的“逻辑大小”:每个字符都有一个特定范围内的编码。这些编码可以使用不同的传输编码来表示,并且在内存内部,Unicode字符通常使用每个字符一个或两个16位数来表示,这取决于字符范围,有时每个字符使用一个32位数。
存储
给定的数字仅用于存储1个字符
ASCII⟶27位(1字节) 扩展ASCII⟶28位(1字节) UTF-8⟶最小28,最大232位(最小1,最大4字节) UTF-16⟶最小216,最大232位(最小2,最大4字节) UTF-32⟶232位(4字节)
使用情况(截至2020年2月)
理解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。
统一码的崛起
ASCII扩展解决了基于拉丁字母的语言的问题…那其他需要完全不同字母表的字母呢?希腊吗?俄罗斯吗?中餐之类的?
我们需要一个全新的角色集……这就是Unicode背后的逻辑。Unicode并不包含每一种语言的每一个字符,但它确实包含了大量的字符(参见这个表)。
您无法将文本保存到硬盘驱动器为“Unicode”。Unicode是文本的抽象表示。您需要对这个抽象表示进行“编码”。这就是编码发挥作用的地方。
编码:UTF-8 vs UTF-16 vs UTF-32
这个答案很好地解释了基本原理:
UTF-8和UTF-16是变长编码。 在UTF-8中,一个字符可以至少占用8位。 在UTF-16中,字符长度以16位开始。 UTF-32是一种固定长度的32位编码。
UTF-8对前128个字符使用ASCII集。这很方便,因为这意味着ASCII文本在UTF-8中也有效。
助记符:
UTF-8:最小8位。 UTF-16:最小16位。 UTF-32:最小32位和最大32位。
注意:
为什么是2 ^ 7 ?
这对一些人来说是显而易见的,但只是以防万一。我们有7个可用的插槽,填满0或1(二进制代码)。 每个都可以有两种组合。如果我们有7个点,我们有2 * 2 * 2 * 2 * 2 * 2 * 2 = 2^7 = 128种组合。把它想象成一个有七个轮子的密码锁,每个轮子只有两个数字。
来源:维基百科,这篇很棒的博客文章和Mocki。在我最初发布这篇摘要的地方。