ASCII和Unicode有什么区别?


407

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

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

Unicode字符有任何大小规范吗?




Answers:


534

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。


4
@riderBill:现在呢?您在说哪3位?Unicode中没有位。只是代码点。
Kerrek SB 2016年

@riderBill:再说一遍:您现在正在谈论哪个“ 3个字节”?:-)(这与Unicode无关。Unicode只与赋予数字含义有关,而与位和字节
无关

8
@riderBill:Unicode的确实没有 “1个4字节之间使用”。Unicode是数字含义的分配。它不使用任何字节。有某些标准化的编码方案将Unicode代码点表示为字节流,但它们与Unicode作为字符集正交。(是的,请随意删除。)
Kerrek SB 2016年

@CleanCrispCode Unicode实际上是ISO-8859-1的超集,而ISO-8859-1本身就是ASCII的超集。有时候这很有用。
Mark Ransom

8
为了澄清,Unicode的字符集本身是ISO-8859-1的超集的字符集,但UTF-8 编码 ISO-8859-1的一个超集编码,但ASCII 编码
minmaxavg

392

首先了解为什么要创建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扩展解决了基于拉丁字母的语言的问题……其他人需要完全不同的字母怎么办?希腊语?俄语?中国人喜欢吗?

我们将需要一个全新的字符集……这就是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将ASCII设置用于前128个字符。这很方便,因为这意味着ASCII文本在UTF-8中也有效。

助记符:

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

注意:

为什么是2 ^ 7?

这对于某些人来说是显而易见的,但以防万一。我们有七个可用0或1(二进制代码)填充的插槽。每个可以有两个组合。如果我们有七个点,则我们有2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128个组合。可以将其视为具有七个轮子的密码锁,每个轮子只有两个数字。

资料来源:Wikipedia这篇很棒的博客文章Mocki,我最初在其中发布了此摘要。


7
没有文字,只有编码文字。某些编码非常简单明了,尤其是对于<= 256个代码点的字符集。“扩展的ASCII”是一个非常模糊的术语。有些支持希腊,俄罗斯和/或波兰语。ASCII不足以表示使用á,ü,ç,ñ的英语文本。我怀疑它旨在支持计算机语言而非人类语言。原则上,当您编写文件或流时,您需要一个字符集并选择一种编码。您的读者必须获得字节和有关哪种编码的知识。否则,通讯失败。
汤姆·布洛杰特

非常感谢您的增编。我相应地更新了答案。
安德鲁

谢谢。我注意到,到处ASCII表都将字符代码显示为0-127,而UTF-8表将其代码显示为十六进制而不是整数。是否有一个原因?为什么UTF-X表不显示0-127 / 255/65535与00-AF?这意味着什么吗?
wayofthefuture

谢谢您的回答。快速问题:'在UTF-16中,字符长度以16位开头'-这是否意味着字母数字字符只能由8位字符表示,所以不能由UTF-16表示?
Moondra '17

很好的答案,只有我一个问题-波兰语真的使用其他字母吗?我以为我们使用的是与英语相同的字母,只是附加了一些字母?
Nicofisi

89

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

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

v2出现时,通常采用16位编码,例如Microsoft和Apple操作系统使用的。还有像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编码又指示字节序,并且对于文本呈现引擎而言是中立的。不幸的是,它是可选的,许多程序员声称有权忽略它,因此事故仍然很常见。



15

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位量表示。


2
我认为这些天最通用的Unicode编码是UTF-8。UTF-8将大多数代码点编码为1、2或3个字节。
Binarus '16

14

ASCII和Unicode是两种字符编码。基本上,它们是如何用二进制表示差异字符的标准,以便可以在数字媒体中进行写入,存储,传输和读取。两者之间的主要区别在于它们编码字符的方式以及它们各自使用的位数。ASCII最初使用7位来编码每个字符。后来,使用扩展ASCII将其增加到八个,以解决原始版本的明显不足。相反,Unicode使用可变位编码程序,您可以在其中选择32位,16位和8位编码。使用更多的位使您可以使用更多的字符,而以较大的文件为代价,而更少的位则为您提供有限的选择,但可以节省很多空间。使用更少的位(即

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

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

为了保持与当时已被广泛使用的较旧ASCII的兼容性,Unicode的设计方式是使前8位与最流行的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.

摘自:http : //www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs



0

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


4
-1对于这个琐碎的重复“答案”,没有为以前的答案添加任何内容。请不要像这样添加重复的杂物(以其他合法的方式获得代表)。
cellepo

-1

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

使用0x十六进制数据的常规前缀表示法,基本的好参考是ASCII文本以字节值开头,0x000x7F表示可能的ASCII字符值之一。通常0xEF 0xBB 0xBF以UTF8 的字节开头来表示UTF文本。对于UTF16,使用起始字节0xFE 0xFF0xFF 0xFE,其起始字节的顺序表示文本字节的字节序。字节值的简单存在(不在可能的字节值的ASCII范围内)也表明数据可能是UTF。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.