ASCII和Unicode有什么区别?

我可以知道Unicode和ASCII之间的确切区别吗?

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

Unicode字符是否有任何大小规范?

ASCII定义了128个字符,映射到数字0-127。 Unicode定义了(小于)2 21个字符,类似地,它们映射到数字0-2 21 (尽pipe不是所有的数字都被赋值,有的被保留)。

Unicode是ASCII的超集,数字0-128在ASCII中的含义与Unicode中的含义相同。 例如,数字65表示“拉丁语资本”A“”。

由于Unicode字符通常不适用于一个8位字节,因此存在以字节序列存储Unicode字符的多种方式,例如UTF-32和UTF-8。

了解为什么首先创buildASCII和Unicode的原因帮助我了解它们是如何工作的。

ASCII,起源

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

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

最后一位(第8位)用于避免作为奇偶校验位的错误。 这在几年前是相关的。

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

请参阅下面的ASCII码中的几个字符的二进制表示forms:

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 Extended解决了基于拉丁字母表的语言问题…其他需要完全不同的字母表的问题呢? 希腊语? 俄语? 抛光? 中国人和喜欢?

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

您不能将文本保存为“Unicode”。 Unicode是文本的抽象表示。 你需要“编码”这个抽象的表示。 这就是编码起作用的地方。

编码:UTF-8与UTF-16对比UTF-32

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

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

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

口诀:

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

注意:

为什么2 ^ 7?

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

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

ASCII有128个编码点,从0到127.它可以放在一个单一的8位字节中,128到255的值可以用于其他字符。 不兼容的select,导致代码页的灾难。 在一个代码页中编码的文本不能被在另一个代码页上假设或猜测的程序正确读取。

Unicode即将解决这个灾难。 版本1以65536个代码点开始,通常以16位编码。 后来在第2版中扩展到了110万个码点。 目前的版本是6.3,使用110,187个可用的110万个码点。 这再也不适合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编码的一个问题是字节的顺序将取决于创build文本stream的机器的字节顺序。 所以添加混合UTF-16BE,UTF-16LE,UTF-32BE和UTF-32LE。

有了这些不同的编码select,在一定程度上带来了代码页的灾难,随着程序员之间激烈的争论,UTF的select是“最好的”。 他们与操作系统的默认关系几乎是一成不变的。 一个反措施是定义一个BOM,即字节顺序标记(Byte Order Mark),在文本stream的开头指定一个特殊的代码点(U + FEFF,零宽度空间),指示如何编码其余的stream。 它表示UTF编码和字节,并且对文本渲染引擎是中性的。 不幸的是,这是可选的,许多程序员声称有权省略它,所以事故仍然很常见。

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

Unicode有1,114,112个代码位置。 目前已经有大约10万个字符被分配给字符,并且许多代码点已经被永久化为非字符(即,不用于对任何字符进行编码),并且大部分代码点还没有被分配。

ASCII和Unicode唯一的共同之处是:1)它们是字符代码。 2)除了ASCII控制字符的编码位置只定义为表示控制字符,其名称与其ASCII码相对应外,Unicode的128个第一码位的定义与ASCII中的含义相同,但其含义是没有在Unicode中定义。

然而,有时候,Unicode被描述为“宽ASCII”(即使在Unicode标准中也是如此)。 这是一个口号,主要是试图传达这样的想法,即Unicode是一种通用字符代码,与ASCII曾经是一样的(尽pipeASCII的字符集不可能普遍使用),与使用不同的代码相反不同的系统和应用程序以及不同的语言。

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

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

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

在这里输入图像描述

ASCII(美国信息交换标准代码)是计算机和互联网上最常见的文本文件格式。 在一个ASCII文件中,每个字母,数字或特殊字符都用一个7位的二进制数字(一串七个0或1)表示。 定义了128个可能的字符。