我能否知道Unicode和ASCII之间的确切区别?
ASCII总共有128个字符(扩展集中有256个字符)。
Unicode字符是否有任何大小规格?
答案 0 :(得分:448)
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。
答案 1 :(得分:277)
理解为什么首先创建了ASCII和Unicode,这有助于我理解两者之间的差异。
ASCII,起源
如其他答案中所述,ASCII使用7位来表示字符。通过使用7位,我们可以最多具有2 ^ 7(= 128)个不同的组合 * 。这意味着我们最多可以代表128个字符。
等等,7位?但为什么不是1字节(8位)?
最后一位(第8位)用于避免错误parity bit。 这在几年前是相关的。
大多数ASCII字符是字母表中的可打印字符,例如abc,ABC,123,?&!等。其他字符是control characters,例如carriage return, line feed,制表符等。
参见下面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表over here。
ASCII仅供英文使用。
什么?为什么只有英文?那里有很多语言!
因为计算机行业的中心在美国 时间。因此,他们不需要支持口音或其他 标记,如á,ü,ç,ñ等(又名diacritics)。
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, also called ISO Latin-1。
Unicode,The Rise
ASCII Extended解决了基于拉丁字母的语言的问题......那些需要完全不同的字母表的其他人呢?希腊语?俄语?中国人和喜欢的人?
我们需要一个全新的字符集......这是Unicode背后的理性。 Unicode不包含每种语言中的每个字符,但它确实包含大量字符(see this table)。
您无法将文本作为“Unicode”保存到硬盘中。 Unicode是文本的抽象表示。您需要“编码”此抽象表示。这就是encoding发挥作用的地方。
编码:UTF-8与UTF-16对比UTF-32
This answer在解释基础知识方面表现非常出色:
UTF-8使用ASCII集作为前128个字符。这很方便,因为它意味着ASCII文本在UTF-8中也有效。
助记符:
注意:
为什么2 ^ 7?
这对某些人来说是显而易见的,但以防万一。我们有七个可用的插槽,填充0或1(Binary Code)。 每个可以有两种组合。如果我们有七个点,我们有2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128个组合。把它想象成一个带七个轮子的密码锁,每个轮子只有两个数字。
答案 2 :(得分:87)
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,对文本呈现引擎是中性的。不幸的是,它是可选的,许多程序员声称他们有权省略它,所以事故仍然很常见。
答案 3 :(得分:25)
答案 4 :(得分:12)
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.
答案 5 :(得分:11)
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位数量。
答案 6 :(得分:1)
除了UTF是ASCII的超集之外,ASCII和UTF之间的另一个好区别是磁盘文件编码,数据表示以及在随机存储器中的存储。程序知道通过在数据的开头检测特殊的字节顺序标记代码,或者通过从程序员的意图假设该数据是文本,然后检查它的模式是否表明给定的数据应被理解为ASCII或UTF字符串。用一种或多种文本编码。
使用osha <- read_excel("file.xlsx", skip = 4, sheet = "Data") %>%
do.stuff
的常规前缀表示十六进制数据,基本的好参考是ASCII文本以代表possible ASCII character values之一的字节值0x
至0x00
开头。通常以UTF8的字节0x7F
开头来表示UTF文本。对于UTF16,使用起始字节0xEF 0xBB 0xBF
或0xFE 0xFF
,其中文本字节的字节序顺序由起始字节的顺序指示。字节值仅存在于可能的字节值的ASCII范围之外的情况也表明数据可能是UTF。
还有其他byte order marks使用不同的代码表示数据应解释为以某种编码标准编码的文本。
答案 7 :(得分:1)
给出的数字仅用于存储1个字符