Unicode和ASCII的确切区别是什么?

ASCII共有128个字符(扩展集为256个)。

Unicode字符有大小规范吗?


当前回答

ASCII定义128个字符,而Unicode包含超过120,000个字符。

其他回答

java提供了对Unicode的支持,即它支持所有世界范围的字母。因此,java中的char的大小是2字节。和范围是0到65535。

ASCII有128个码位,从0到127。它可以容纳一个8位字节,值128到255往往用于其他字符。不兼容的选择,导致代码页灾难。在一个代码页中编码的文本不能被假设或猜测另一个代码页的程序正确读取。

Unicode的出现解决了这个灾难。版本1开始有65536个代码点,通常用16位编码。后来在版本2中扩展到110万个代码点。当前版本是6.3,使用了110万个可用代码点中的110,187个。这已经不适合16位了。

当v2出现时,16位编码非常普遍,例如微软和苹果的操作系统就使用了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。

Having these different encoding choices brings back the code page disaster to some degree, along with heated debates among programmers which UTF choice is "best". Their association with operating system defaults pretty much draws the lines. One counter-measure is the definition of a BOM, the Byte Order Mark, a special codepoint (U+FEFF, zero width space) at the beginning of a text stream that indicates how the rest of the stream is encoded. It indicates both the UTF encoding and the endianess and is neutral to a text rendering engine. Unfortunately it is optional and many programmers claim their right to omit it so accidents are still pretty common.

理解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。在我最初发布这篇摘要的地方。

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位数。

除了UTF是ASCII的超集之外,ASCII和UTF之间另一个很好的区别是在磁盘文件编码和数据表示以及随机内存中的存储方面。程序知道给定的数据应该被理解为ASCII或UTF字符串,方法是检测数据开头的特殊字节顺序标记代码,或者从程序员的意图假设数据是文本,然后检查它的模式,表明它是一种文本编码或另一种文本编码。

Using the conventional prefix notation of 0x for hexadecimal data, basic good reference is that ASCII text starts with byte values 0x00 to 0x7F representing one of the possible ASCII character values. UTF text is normally indicated by starting with the bytes 0xEF 0xBB 0xBF for UTF8. For UTF16, start bytes 0xFE 0xFF, or 0xFF 0xFE are used, with the endian-ness order of the text bytes indicated by the order of the start bytes. The simple presence of byte values that are not in the ASCII range of possible byte values also indicates that data is probably UTF.

还有其他一些字节顺序标记,它们使用不同的代码来表示数据应该被解释为以某种编码标准编码的文本。