Unicode和ASCII有什么确切的区别?
ASCII共有128个字符(扩展集中为256个)。
Unicode字符有大小规格吗?
Unicode和ASCII有什么确切的区别?
ASCII共有128个字符(扩展集中为256个)。
Unicode字符有大小规格吗?
ASCII定义了128个字符,这些字符映射到0-127的数字。Unicode定义了(少于)221个字符,同样映射到0-221的数字(尽管并非所有数字都已分配,并且一些数字是保留的)。
Unicode是ASCII的超集,数字0-127在ASCII中与它们在Unicode中的意义相同。例如,数字65表示“拉丁大写字母A”。
由于Unicode字符通常无法适应一个8位字节,因此有许多方法可以用字节序列存储Unicode字符,例如UTF-32和UTF-8。
了解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 一些聪明的人开始使用第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使用ASCII集合中的前128个字符。这很方便,因为这意味着ASCII文本在UTF-8中也是有效的。
助记符:
注意:
为什么是2^7?
来源:维基百科,这篇优秀的博客文章和Mocki.co,我最初发布了这个摘要。对于一些人来说这很明显,但以防万一。我们有七个可用的插槽,可以填充0或1 (二进制代码)。每个插槽都有两种组合方式。如果我们有七个插槽,那么我们就有2 * 2 * 2 * 2 * 2 * 2 * 2 = 2^7 = 128种组合方式。将其视为一个有七个轮子的组合锁,每个轮子上只有两个数字。
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编码和字节顺序,并且对文本呈现引擎是中立的。 不幸的是,它是可选的,许多程序员声称他们有权省略它,因此意外仍然相当普遍。
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位数量的表示。
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.
给定的数字仅用于存储1个字符
ASCII 定义了 128 个字符,而 Unicode 包含了超过 120,000 个字符的库。
除了UTF是ASCII的超集之外,另一个了解ASCII和UTF之间的好区别是在磁盘文件编码、数据表示和随机存储方面。程序知道给定的数据应该被理解为ASCII或UTF字符串,要么通过检测数据开头的特殊字节顺序标记代码,要么通过假设数据是文本并检查其中是否存在指示其属于某种文本编码的模式。
使用十六进制数据的传统前缀表示法0x
,基本的好参考是ASCII文本以字节值0x00
到0x7F
开始,表示其中一个可能的ASCII字符值。UTF文本通常以字节0xEF 0xBB 0xBF
开始表示UTF8。对于UTF16,使用起始字节0xFE 0xFF
或0xFF 0xFE
,其中文本字节的字节顺序由起始字节的顺序指示。存在不在ASCII可能字节值范围内的字节值也表明数据很可能是UTF。
还有其他字节顺序标记,它们使用不同的代码来指示数据应该被解释为特定编码标准下的文本。