Ker*_* SB 489
ASCII定义128个字符,映射到数字0-127.Unicode定义(少于)2 21个字符,类似地,映射到数字0-2 21(尽管并非所有数字当前都已分配,有些是保留的).
Unicode是ASCII的超集,数字0-128在ASCII中的含义与在Unicode中的含义相同.例如,数字65表示"拉丁语资本'A'".
由于Unicode字符通常不适合一个8位字节,因此有许多方法可以在字节序列中存储Unicode字符,例如UTF-32和UTF-8.
Mat*_*att 347
了解为什么 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)
Run Code Online (Sandbox Code Playgroud)
请在此处查看完整的ASCII表.
ASCII仅适用于英语.
什么?为什么只有英文?那里有很多语言!
因为当时计算机行业的中心在美国.因此,他们不需要支持口音或其他标记,如á,ü,ç,ñ等(又名变音符号).
ASCII扩展
一些聪明的人开始使用第8位(用于奇偶校验的位)来编码更多字符以支持他们的语言(例如,支持"é",例如法语).只需使用一个额外的位,就可以将原始ASCII表的大小加倍,最多可以映射256个字符(2 ^ 8 = 256个字符).而不是像以前那样2 ^ 7(128).
10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)
Run Code Online (Sandbox Code Playgroud)
这个"ASCII扩展到8位而不是之前的7位"的名称可以简称为"扩展ASCII"或"8位ASCII".
正如@Tom在下面的评论中所指出的,没有" 扩展ASCII " 这样的东西,但这是一个简单的方法来引用这个第8位技巧.8位ASCII表有许多变体,例如ISO 8859-1,也称为ISO Latin-1.
Unicode,The Rise
ASCII Extended解决了基于拉丁字母的语言的问题......其他需要完全不同的字母表的人呢?希腊语?俄语?中国人喜欢?
我们需要一个全新的字符集......这是Unicode背后的理性.Unicode不包含每种语言的每个字符,但它确实包含大量字符(请参阅此表).
您无法将文本作为"Unicode"保存到硬盘驱动器.Unicode是文本的抽象表示.您需要"编码"此抽象表示.这就是编码发挥作用的地方.
编码:UTF-8 vs UTF-16 vs UTF-32
这个答案在解释基础知识方面做得非常好:
UTF-8使用ASCII集作为前128个字符.这很方便,因为它意味着ASCII文本在UTF-8中也有效.
口诀:
注意:
为什么2 ^ 7?
这对一些人来说是显而易见的,但以防万一.我们有七个插槽可用0或1(二进制代码)填充.每个可以有两种组合.如果我们有七个点,我们有2*2*2*2*2*2*2 = 2 ^ 7 = 128个组合.把它想象成一个带七个轮子的密码锁,每个轮子只有两个数字.
Han*_*ant 88
ASCII有128个代码点,0到127.它可以放在一个8位字节中,值128到255倾向于用于其他字符.具有不兼容的选择,导致代码页发生灾难.在一个代码页中编码的文本无法由在另一个代码页上假定或猜到的程序正确读取.
Unicode即将解决这场灾难.版本1以65536个代码点开始,通常以16位编码.后来在第2版扩展到110万个代码点.当前版本为6.3,使用了110,187个可用的110万个代码点.这不再适合16位.
当v2出现时,16位编码很常见,例如微软和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编码和endianess,对文本呈现引擎是中性的.不幸的是,它是可选的,许多程序员声称他们有权省略它,所以事故仍然很常见.
Sid*_*ted 32
java提供对Unicode的支持,即它支持所有全球字母表.因此java中char的大小是2个字节.范围是0到65535.
Juk*_*ela 13
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位数量.
Nik*_*tre 13
ASCII和Unicode是两种字符编码.基本上,它们是如何用二进制表示差异字符的标准,以便它们可以在数字媒体中编写,存储,传输和读取.两者之间的主要区别在于它们对字符进行编码的方式以及它们用于每个字符的位数.ASCII最初使用7位来编码每个字符.后来使用扩展ASCII将其增加到8,以解决原始的明显不足.相比之下,Unicode使用可变位编码程序,您可以在其中选择32位,16位和8位编码.使用更多位可以让您以更大的文件为代价来使用更多的字符,而更少的位可以让您选择有限但节省了大量空间.如果使用英语编码大型文档,则使用较少的位(即UTF-8或ASCII)可能是最佳选择.
Unicode是问题的主要原因之一是许多非标准的扩展ASCII程序.除非您使用的是Microsoft和大多数其他软件公司使用的流行页面,否则您的字符可能会出现问题.Unicode几乎消除了这个问题,因为所有字符代码点都是标准化的.
Unicode的另一个主要优点是,它最多可以容纳大量字符.因此,Unicode目前包含大多数书面语言,并且仍有更多空间.这包括典型的从左到右的脚本,如英语,甚至是从右到左的脚本,如阿拉伯语.中文,日文和许多其他变体也在Unicode中表示.所以Unicode不会很快被替换.
为了保持与当时广泛使用的旧ASCII的兼容性,Unicode的设计方式使得前八位与最流行的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.
Run Code Online (Sandbox Code Playgroud)
取自:http://www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs