ASCII和Unicode有什么区别?

554

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

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

Unicode字符有大小规格吗?


8
ASCII和Unicode是计算机中用于表示字符的编码标准。ASCII是最早的编码系统,只能表示英文字符、数字和一些符号,共128个字符。而Unicode则包含了全球范围内的所有语言和字符,包括汉字、日语假名、希腊字母等,总共超过13万个字符。在计算机中,每个字符都有一个对应的数值来表示,这些数值被称为字符编码。计算机使用字符编码将字符转换为二进制数,便于存储和传输。ASCII采用7位二进制数表示一个字符,因此它最多只能表示128个字符,不足以满足世界各地使用的不同语言。而Unicode采用更多的位数来表示一个字符,能够表示更多的字符。现代计算机通常支持Unicode编码,因此它可以显示不同语言的字符,使得跨语言沟通变得更加简单。 - Koray Tugay
14
软件开发人员绝对必须知道的关于 Unicode 和字符集的最基本内容(不能有任何借口!):这篇文章介绍了 Unicode 和字符集的基础概念,并解释了为什么在编程中正确处理字符集非常重要。阐述了 ASCII、ISO-8859-1、UTF-8 和 UTF-16 等常见字符集之间的区别,并提供了一些实用技巧和建议,以帮助开发人员避免常见的字符集问题。 - phuclv
1
http://www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/ - Channa
9个回答

671

ASCII定义了128个字符,这些字符映射到0-127的数字。Unicode定义了(少于)221个字符,同样映射到0-221的数字(尽管并非所有数字都已分配,并且一些数字是保留的)。

Unicode是ASCII的超集,数字0-127在ASCII中与它们在Unicode中的意义相同。例如,数字65表示“拉丁大写字母A”。

由于Unicode字符通常无法适应一个8位字节,因此有许多方法可以用字节序列存储Unicode字符,例如UTF-32和UTF-8。


6
现在怎么办?你说的是哪3个位?Unicode中没有位,只有码点。 - Kerrek SB
1
@riderBill:再说一遍,你现在指的是哪个“3字节”? :-) (这与Unicode无关。 Unicode仅涉及将含义分配给数字,而不涉及位和字节。) - Kerrek SB
16
@riderBill说:Unicode并没有“使用1到4个字节”。Unicode是对数字分配含义的一种方式,它不使用任何字节。有些标准化的编码方案用于将Unicode代码点表示为一系列字节流,但它们与Unicode字符集是正交的。(是的,请随意删除您愿意删除的内容。) - Kerrek SB
@CleanCrispCode Unicode实际上是ISO-8859-1的超集,而后者本身又是ASCII的超集。有时候了解这一点是很有用的。 - Mark Ransom
8
Unicode字符集本身是ISO-8859-1字符集的超集,但UTF-8编码不是ISO-8859-1编码的超集,而是ASCII编码的超集。 - minmaxavg

574

了解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 vs UTF-16 vs 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种组合方式。将其视为一个有七个轮子的组合锁,每个轮子上只有两个数字。

来源:维基百科这篇优秀的博客文章Mocki.co,我最初发布了这个摘要。

11
“没有文本,只有编码文本。” 一些编码非常直接,特别是对于具有<=256个代码点的字符集。 “扩展ASCII”是一个非常模糊的术语;有一些支持希腊语、俄语和/或波兰语的字符集。 ASCII对于使用á、ü、ç、ñ的英语文本不足够。我怀疑它是为了支持计算机语言而设计的,而不是人类语言。教条主义地说,当您编写文件或流时,您有一个字符集并选择一个编码。您的读者必须获得字节和对应编码的知识。否则,通信将失败。 - Tom Blodget
谢谢。我注意到无论在哪里,ASCII表都将字符代码显示为0-127,但UTF-8表将代码显示为十六进制而不是整数。这是有原因的吗?为什么UTF-X表不显示0-127/255/65535与00-AF?这意味着什么? - wayofthefuture
谢谢您的回答。我有个问题:'在UTF-16中,字符长度从16位开始'--这是否意味着字母数字字符不能由UTF-16表示,因为它们只是8位字符? - Moondra
很好的回答,只是我有一个问题——波兰真的使用不同的字母表吗?我认为我们使用与英语相同的字母表,只是加上了一些额外的字母? - Nicofisi
好的解释。适当地解释一下Unicode可能会更好。Unicode是一个大型标准化努力,对每种主要语言中使用的所有字符和符号进行了编目和规定其关系,涵盖数十万个字符。 - Bharathkumar V

96

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

Unicode应运而生以解决这场灾难。版本1开始有65536个字符编码点,通常使用16位编码。随后在版本2中扩展到110万个字符编码点。当前版本是6.3,使用了可用的110187个110万个字符编码点。这已经超出了16位的范围。

当v2出现时,使用16位编码非常普遍,例如Microsoft和Apple操作系统。还有像Java这样的语言运行时。 v2规范提出了一种将这110万个字符编码点映射到16位的方法。一种称为UTF-16的编码,这是一种可变长度编码,其中一个字符编码点可以占用2或4个字节。原始的v1字符编码点占用2个字节,新增加的字符编码点占用4个字节。

另一种非常常见的可变长度编码是UTF-8,在*nix操作系统和工具中使用。一个字符编码点可以占用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编码和字节顺序,并且对文本呈现引擎是中立的。 不幸的是,它是可选的,许多程序员声称他们有权省略它,因此意外仍然相当普遍。


37

Java提供对Unicode的支持,即它支持全球所有的字母表。因此,在Java中,char的大小为2个字节,范围是0到65535。

在此输入图片描述


1
关键图片来说明..好的。 - Ponmari Subramanian
@Mark,256 是当你考虑所有 ASCII 范围(包括扩展)时的值。 - Thinker-101
@Thinker-101,“扩展ASCII”这种说法是不存在的。有许多编码方式不同地定义了字节128-255的含义。ASCII定义了字节0-127的含义。 - Mark Tolonen

18

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

Unicode有1,114,112个码位。其中约有100,000个已被分配给字符,许多码位已被永久地指定为非字符(即从未用于编码任何字符),并且大多数码位尚未分配。

ASCII和Unicode唯一共同点是:1)它们都是字符编码。2)Unicode的前128个码位已被定义为具有与ASCII相同的含义,但ASCII控制字符的码位仅被定义为表示控制字符,并具有对应其ASCII名称的名称,但它们的含义在Unicode中未被定义。

然而,有时候Unicode被描述为“宽ASCII”(甚至在Unicode标准中也是如此!)。这是一个口号,主要试图传达Unicode旨在成为像ASCII一样的通用字符编码(尽管ASCII的字符集对于通用使用是无望的不足),与在不同系统、应用程序和不同语言中使用不同的代码截然相反。

Unicode本身仅定义了字符的“逻辑大小”:每个字符具有特定范围内的代码编号。这些代码编号可以使用不同的传输编码来呈现,并且在内存中,Unicode字符通常使用每个字符一个或两个16位数量来表示,取决于字符范围,有时使用每个字符一个32位数量的表示。


2
我认为现在最常见的Unicode编码是UTF-8。UTF-8将大部分代码点编码为1、2或3个字节。 - Binarus

15
ASCII和Unicode是两种字符编码。它们是关于如何以二进制表示不同字符的标准,以便可以在数字媒体中写入、存储、传输和阅读。两者之间的主要区别在于它们如何编码字符以及它们为每个字符使用的位数。 ASCII最初使用七位编码每个字符,后来增加到八位用于扩展ASCII以解决原始编码的明显不足。相比之下,Unicode使用可变位编码程序,你可以选择32、16或8位编码。使用更多位让你能够使用更多的字符,但文件会变大,而使用更少的位则使你选择有限,但可以节省大量空间。如果你正在对英文进行大型文档编码,则使用较少的位(即UTF-8或ASCII)可能是最好的选择。
Unicode的一个主要优点是它最多可以容纳大量字符。因此,Unicode目前包含大多数书面语言,仍然有空间容纳更多。这包括从左到右的典型脚本,如英语,甚至从右到左的脚本,如阿拉伯语。汉语、日本语和其他许多变种也在Unicode中表示。因此,Unicode短期内不会被取代。
为了与已经广泛使用的旧ASCII保持兼容性,Unicode设计成前8位匹配最流行的ASCII页面。因此,如果你使用Unicode打开一个ASCII编码的文件,你仍然可以得到正确的字符编码。这简化了采用Unicode的步骤,使那些已经使用ASCII的人对采用新的编码标准的影响减少了。
总之,ASCII和Unicode是两种不同的字符编码标准,它们具有不同的编码方式和位数,选择应根据具体情况而定。 Unicode的主要优点是它可以容纳大量字符,并且在遇到非标准扩展ASCII程序时更加稳定。同时,为了维护与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


2
这个答案非常不正确,术语也完全错误。例如:“ASCII和Unicode是两种字符编码”。不!它们是字符集。"...它们是关于如何用二进制表示不同字符的标准"。不!Unicode没有关于如何用二进制表示字符的规定。这就是像UTF-8这样的字符编码所做的事情。而声称“Unicode使用可变位编码”纯粹是无稽之谈。你复制/粘贴了一篇错误的文章,应该删除这个答案。这种错误信息不应该发布在SO上。 - skomisa

4

存储

给定的数字仅用于存储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月)

Percentages of websites using various character encodings


-1

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


8
这个微不足道的重复“答案”没有为早先的回答增添任何内容,因此我会给它打负分。请不要添加这样的重复信息(通过其他合法方式获得声望)。 - cellepo

-1

除了UTF是ASCII的超集之外,另一个了解ASCII和UTF之间的好区别是在磁盘文件编码、数据表示和随机存储方面。程序知道给定的数据应该被理解为ASCII或UTF字符串,要么通过检测数据开头的特殊字节顺序标记代码,要么通过假设数据是文本并检查其中是否存在指示其属于某种文本编码的模式。

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

还有其他字节顺序标记,它们使用不同的代码来指示数据应该被解释为特定编码标准下的文本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接