当前位置: 首页 > 知识库问答 >
问题:

ASCII和Unicode有什么区别?

邢乐
2023-03-14

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

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

Unicode字符有大小规格吗?

共有3个答案

笪昌翰
2023-03-14

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

Unicode即将解决这场灾难。版本1开始时有65536个代码点,通常用16位编码。后来在版本2中扩展到110万个代码点。当前版本为6.3,使用110万代码点中的110187个。这已经不适合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编码的一个问题是字节的顺序将取决于创建文本流的机器的尾端。因此,将UTF-16BE、UTF-16LE、UTF-32BE和UTF-32LE混合在一起。

有了这些不同的编码选择,在某种程度上会让代码页灾难卷土重来,同时程序员之间也在激烈辩论UTF选择哪个是“最好的”。它们与操作系统默认值的关联在很大程度上说明了问题。一个计数器度量是BOM的定义、字节顺序标记、文本流开头的一个特殊代码点(U FEFF、零宽度空间),该代码点指示流其余部分的编码方式。它指示UTF编码和endianess,并且与文本呈现引擎无关。不幸的是,它是可选的,许多程序员声称他们有权忽略它,所以事故仍然很常见。

白光耀
2023-03-14

理解为什么首先创建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位(用于奇偶校验的位)编码更多字符以支持他们的语言(例如,支持法语中的“e”)。只需使用一个额外的位,即可将原始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对UTF-16对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?

这对一些人来说是显而易见的,但只是以防万一。我们有七个可用插槽,其中填充了0或1(二进制代码)。每个可以有两种组合。如果我们有七个点,我们有2*2*2*2*2*2*2*2=2^7=128个组合。将其视为一个具有七个车轮的组合锁,每个车轮只有两个数字。

来源:维基百科,这篇伟大的博文和Mocki。我最初发布此摘要的地方。

白翔
2023-03-14

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

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

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

 类似资料:
  • 本文向大家介绍ascii、unicode、utf-8、gbk 区别相关面试题,主要包含被问及ascii、unicode、utf-8、gbk 区别时的应答技巧和注意事项,需要的朋友参考一下  

  • 问题内容: 两者都意味着空间,但是有什么区别吗? 问题答案: 一个是不间断空间,另一个是常规空间。不间断的空格表示该行不应在该点处换行,就像它不会在一个单词的中间换行一样。 此外,正如斯文德(Svend)在其评论中指出的那样,不间断的空间不会崩溃。

  • 本文向大家介绍<%# %> 和 <% %> 有什么区别?相关面试题,主要包含被问及<%# %> 和 <% %> 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 答:<%# %>表示绑定的数据源 <%%>是服务器端代码块  

  • 问题内容: 当我解析XML时: 字符解析事件处理程序包括。 怎么能变成? 这是本文中的主要问题,其余仅显示对此的进一步(令人发指)的想法 Python unicode不会被破坏,因为它会产生收益吗?u’\ xfc’已经是一个unicode字符串,因此再次将其转换为unicode不起作用!将其转换为ASCII也不起作用。 我发现唯一可行的方法是:(这不是故意的,对吧?) 用utf-8替换8859失败

  • 2015-05-08 实验楼 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为“字节”。 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为“计算机”。 开始计算机只在美国用。八位的字节一共可以组合出256(2的8次

  • 问题内容: 以下代码之间有什么区别: 和 Python建议采用一种做事方式,但有时似乎不止一种。 问题答案: 一个是函数调用,一个是文字: 使用第二种形式。它更具Python风格,并且可能更快(因为它不涉及加载和调用单独的函数)。