ASCII和Unicode有什么区别?

What's the difference between ASCII and Unicode?

我能知道Unicode和ASCII的确切区别吗?

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

有Unicode字符的大小规格吗?


ASCII定义128个字符,这些字符映射到数字0–127。Unicode定义(少于)221个字符,与此类似,这些字符映射到数字0–221(尽管当前并非所有数字都已分配,并且某些数字是保留的)。

Unicode是ASCII的超集,数字0–128在ASCII中的含义与Unicode中的含义相同。例如,数字65表示"拉丁文大写‘A’"。

因为unicode字符通常不适合一个8位字节,所以有许多方法可以将unicode字符存储在字节序列中,例如utf-32和utf-8。


理解为什么首先创建ASCII和Unicode有助于我理解两者之间的区别。

ASCII的起源

如其他答案所述,ASCII使用7位来表示一个字符。通过使用7位,我们最多可以有2^7(=128)个不同的组合*。这意味着我们最多可以代表128个字符。

Wait, 7 bits? But why not 1 byte (8 bits)?

The last bit (8th) is used for avoiding errors as parity bit.
This was relevant years ago.

大多数ASCII字符是字母表中可打印的字符,如abc、abc、123、?和!其他是控制字符,如回车符、换行符、制表符等。

请参见以下以ASCII表示的几个字符的二进制表示:

1
2
3
4
5
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仅用于英语。

What? Why English only? So many languages out there!

Because the center of the computer industry was in the USA at that
time. As a consequence, they didn't need to support accents or other
marks such as á, ü, ?, ?, etc. (aka diacritics).

扩展的ASCII

一些聪明的人开始使用第8位(用于奇偶校验的位)来编码更多的字符来支持他们的语言(例如法语中支持"_")。只需使用一个额外的位,就可以使原来的ASCII表的大小翻倍,以映射最多256个字符(2^8=256个字符)。而不是以前的2^7(128)。

1
2
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,也称为isoLatin-1。

Unicode,崛起

ASCII扩展解决了基于拉丁字母的语言的问题…其他人需要完全不同的字母表呢?希腊语?俄语?中文之类的?

我们需要一个全新的角色集…这就是Unicode背后的理性。Unicode并不包含每种语言中的每一个字符,但它确实包含大量的字符(请参见下表)。

无法将文本以"unicode"格式保存到硬盘中。Unicode是文本的抽象表示。您需要"编码"这个抽象表示。这就是编码发挥作用的地方。

编码:UTF-8、UTF-16、UTF-32

这个答案在解释基础知识方面做得很好:

  • utf-8和utf-16是可变长度编码。
  • 在UTF-8中,一个字符至少可以占用8位。
  • 在UTF-16中,字符长度以16位开头。
  • UTF-32是32位的固定长度编码。

UTF-8对前128个字符使用ASCII集。这很方便,因为它意味着ASCII文本在UTF-8中也是有效的。

Mnemonics:

  • UTF-8:最小8位。
  • UTF-16:最小16位。
  • UTF-32:最小和最大32位。

注:

Why 2^7?

This is obvious for some, but just in case. We have seven slots available filled with either 0 or 1 (Binary Code).
Each can have two combinations. If we have seven spots, we have 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2^7 = 128 combinations. Think about this as a combination lock with seven wheels, each wheel having two numbers only.

资料来源:维基百科和这篇伟大的博客文章。


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

Unicode即将解决这场灾难。版本1从65536个码位开始,通常以16位编码。后来在版本2中扩展到110万个代码点。当前版本是6.3,使用110万个可用代码点中的110187个。这已经不适合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编码和endianes,对文本呈现引擎是中性的。不幸的是,它是可选的,许多程序员声称他们有权省略它,所以事故仍然很常见。


Java为Unicode提供支持,即它支持所有全世界的字母表。因此,Java中的字符大小为2字节。范围是0到65535。

enter image description here


ASCII和Unicode是两个字符编码。基本上,它们是如何用二进制表示不同字符的标准,以便在数字媒体中写入、存储、传输和读取这些字符。两者之间的主要区别在于它们对字符的编码方式以及各自使用的位数。ASCII最初使用七位编码每个字符。后来这一数字增加到了8位,并扩展了ASCII码,以解决原始码的明显不足。相反,Unicode使用一个可变位编码程序,您可以在32、16和8位编码之间进行选择。使用更多的位可以以牺牲较大文件为代价使用更多的字符,而使用更少的位则会给您一个有限的选择,但您可以节省大量的空间。如果用英语编码一个大文档,那么使用较少的位(即UTF-8或ASCII)可能是最好的方法。

Unicode的主要原因之一是许多非标准扩展的ASCII程序导致了这个问题。除非您使用的是微软和大多数其他软件公司使用的流行页面,否则您很可能会遇到字符显示为方框的问题。Unicode实际上消除了这个问题,因为所有字符代码点都是标准化的。

Unicode的另一个主要优点是它最大限度地容纳大量字符。正因为如此,Unicode目前包含了大多数书面语言,而且还有更多的空间。这包括典型的从左到右的脚本,如英语,甚至从右到左的脚本,如阿拉伯语。中文、日文和许多其他变体也用Unicode表示。所以Unicode不会很快被替换。

为了保持与旧的ASCII(当时已经广泛使用)的兼容性,Unicode的设计使前8位与最流行的ASCII页相匹配。因此,如果用Unicode打开一个ASCII编码的文件,您仍然可以得到文件中编码的正确字符。这有助于采用Unicode,因为它减少了为已经使用ASCII的用户采用新编码标准的影响。

总结:

1
2
3
4
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.

摘自:http://www.difference between.net/technology/software technology/difference between unicode and ascii/ixzz4zejnxphs


ASCII有128个代码位置,分配给图形字符和控制字符(控制代码)。

Unicode有1114112个代码位置。目前,大约有100000个代码点被分配给了字符,许多代码点被永久性地设置为非字符(即从未用于编码任何字符),而且大多数代码点还没有被分配。

ASCII和Unicode唯一的共同点是:1)它们是字符代码。2)Unicode的128个第一个代码位置被定义为与ASCII中的含义相同,但ASCII控制字符的代码位置只是定义为表示控制字符,其名称对应于其ASCII名称,但其含义未在Unicode中定义。

然而,有时Unicode是有特点的(甚至在Unicode标准中!)作为"宽ASCII"。这是一个口号,主要试图传达这样一个理念:Unicode是一个通用字符代码,就像以前的ASCII一样(尽管ASCII的字符库完全不足以通用),与在不同的系统、应用程序和不同的语言中使用不同的代码相反。

因此,Unicode只定义字符的"逻辑大小":每个字符在特定范围内都有一个代码编号。这些代码可以使用不同的传输编码来表示,在内存中,Unicode字符通常使用每个字符一个或两个16位数量来表示,这取决于字符范围,有时每个字符使用一个32位数量。


ASCII定义128个字符,因为Unicode包含超过120000个字符的指令表。