ASCII码和Unicode码的区别是什么?

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

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

Unicode字符有大小规范吗?

542527 次浏览

ASCII定义了128个字符,对应到数字0–127。Unicode定义了(小于)221字符,类似地,它映射到数字0–221(尽管目前不是所有的数字都被分配了,有些是保留的)。

Unicode是ASCII的超集,数字0–127在ASCII中的含义与在Unicode中的含义相同。例如,数字65的意思是“拉丁大写字母‘A’”。

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

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

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。

在某种程度上,这些不同的编码选择又带来了代码页灾难,以及程序员之间激烈的争论,哪种UTF选择是“最好的”。它们与操作系统默认值的关联几乎划清了界限。一个对策是定义一个BOM,字节顺序标记,一个特殊的码点(U+FEFF,零宽度空间)在文本流的开始,它表明流的其余部分是如何编码的。它表示UTF编码和尾字符,对文本呈现引擎是中立的。不幸的是,它是可选的,许多程序员声称他们有权省略它,所以事故仍然很常见。

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

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

ASCII,起源

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

等等,7位?但为什么不是1字节(8位)呢?

最后一位(第8位)用于避免错误,如校验位

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

请看下面几个字符在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是文本的抽象表示。你需要“编码”;这个抽象的表示。这就是编码开始发挥作用的地方。

编码: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位。

注意:

为什么是2 ^ 7 ?

这对某些人来说是显而易见的,但只是以防万一。我们有7个可用的插槽,填满0或1 (二进制代码)。 每个都可以有两种组合。如果我们有7个点,我们有2 * 2 * 2 * 2 * 2 * 2 * 2 = 2^7 = 128种组合。把它想象成一个有七个轮子的密码锁,每个轮子只有两个数字

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

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

enter image description here

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

Unicode问题的主要原因之一来自于许多非标准扩展ASCII程序。除非您使用的是微软和大多数其他软件公司使用的流行页面,否则您很可能会遇到字符显示为方框的问题。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

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

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

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

存储

给定的数字仅用于存储1个字符

  • 美国信息交换标准代码⟶27位(1个字节)
  • 扩展的ASCII⟶28位(1字节)
  • utf - 8⟶最小28,最大232位(最小1,最大4字节)
  • utf - 16⟶最小216,最大232位(最小2,最大4字节)
  • utf - 32⟶232位(4字节)

Usage(截至2020年2月)

使用各种字符编码的网站百分比