为了账号安全,请及时绑定邮箱和手机立即绑定

ASCII和Unicode有什么区别?

ASCII和Unicode有什么区别?

慕工程0101907 2019-11-04 14:50:54
我能知道Unicode和ASCII的确切区别吗?ASCII总共有128个字符(扩展集中的256个字符)。Unicode字符有任何大小规范吗?
查看完整描述

3 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

ASCII定义了128个字符,它们映射到数字0–127。Unicode定义(少于2个)21个字符,类似地,它们映射到数字0–2 21(尽管当前并非所有数字都被分配,而某些数字是保留的)。

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

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


查看完整回答
反对 回复 2019-11-04
?
jeck猫

TA贡献1909条经验 获得超7个赞

首先了解为什么要创建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在下面的评论中指出的那样,没有诸如“ extended ASCII ”之类的东西,但这是引用此8位技巧的简便方法。8位ASCII表有很多变体,例如ISO 8859-1,也称为ISO Latin-1。


Unicode,崛起


ASCII扩展解决了基于拉丁字母的语言的问题……其他人需要完全不同的字母怎么办?希腊语?俄语?中国人喜欢吗?


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


您不能将文本以“ Unicode”保存到硬盘驱动器。Unicode是文本的抽象表示。您需要“编码”此抽象表示。这就是编码发挥作用的地方。


编码:UTF-8与UTF-16与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个组合。可以将其想象为具有七个轮子的密码锁,每个轮子只有两个数字。


资料来源:Wikipedia,这篇很棒的博客文章和Mocki,我最初在其中发布了此摘要。


查看完整回答
反对 回复 2019-11-04
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

ASCII具有128个代码点,从0到127。它可以容纳在单个8位字节中,值128到255倾向于用于其他字符。选择不兼容会导致代码页灾难。假定或猜测另一代码页的程序无法正确读取在一个代码页中编码的文本。

Unicode来解决这一灾难。第1版以65536个代码点开始,通常以16位编码。后来在版本2中扩展到110万个代码点。当前版本是6.3,使用了110187个可用代码点中的110,187个。这不再适合16位。

v2出现时,通常采用16位编码,例如Microsoft和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编码又指示字节序,并且对于文本呈现引擎而言是中立的。不幸的是,它是可选的,许多程序员声称有权忽略它,因此事故仍然很常见。


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 926 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信