ChatGPT解决这个技术问题 Extra ChatGPT

ASCII 和 Unicode 有什么区别?


M
Mark Tolonen

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

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

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


@riderBill:现在呢?你说的是哪3位? Unicode 中没有位。只是代码点。
@riderBill:再说一遍:你现在说的是哪个“3 个字节”? :-) (这与 Unicode 无关。Unicode 只是为数字赋予意义,与位和字节无关。)
@riderBill:Unicode 不“使用 1 到 4 个字节”。 Unicode 是对数字的意义分配。它不使用任何字节。有一些标准化的编码方案可以将 Unicode 代码点表示为字节流,但它们与作为字符集的 Unicode 正交。 (是的,请随意删除。)
@CleanCrispCode Unicode 实际上是 ISO-8859-1 的超集,它本身就是 ASCII 的超集。有时知道这很有用。
澄清一下,Unicode 字符集本身是 ISO-8859-1 字符集的超集,但 UTF-8 编码不是 ISO-8859-1 编码的超集,而是 ASCII 编码。
A
Andrew

理解为什么首先创建 ASCII 和 Unicode 有助于我理解两者之间的区别。

ASCII,起源

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

等等,7位?但为什么不是 1 个字节(8 位)?最后一位(第 8 位)用于避免错误作为奇偶校验位。这在几年前是相关的。

大多数 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 仅用于英语。

什么?为什么只有英文?那里有这么多语言!因为当时计算机产业的中心在美国。因此,它们不需要支持重音符号或其他标记,例如 á、ü、ç、ñ 等(也称为变音符号)。

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,崛起

ASCII Extended 解决了基于拉丁字母的语言的问题......其他需要完全不同的字母的语言呢?希腊语?俄语?中国人之类的?

我们需要一个全新的字符集……这就是 Unicode 背后的原因。 Unicode 不包含来自每种语言的每个字符,但它肯定包含大量字符 (see this table)。

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

编码:UTF-8 vs UTF-16 vs UTF-32

This answer 在解释基础知识方面做得很好:

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(二进制代码)。每个都可以有两种组合。如果我们有 7 个点,我们就有 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2^7 = 128 种组合。把它想象成一个有七个轮子的密码锁,每个轮子只有两个数字。

来源:Wikipediathis great blog postMocki.co 我最初发布此摘要的地方。


没有文本,只有编码文本。一些编码非常简单,特别是对于具有 <= 256 个代码点的字符集。 “扩展 ASCII”是一个非常模糊的术语;有些确实支持希腊语、俄语和/或波兰语。 ASCII 不足以用于英文文本,它确实使用 á、ü、ç、ñ。我怀疑它是为支持计算机语言而不是人类语言而设计的。从教条上讲,当您编写文件或流时,您有一个字符集并选择一种编码。您的读者必须了解字节和编码的知识。否则,通信失败。
谢谢你。我注意到 ASCII 表到处都将字符代码显示为 0-127,但 UTF-8 表将代码显示为十六进制而不是整数。是否有一个原因?为什么 UTF-X 表不显示 0-127/255/65535 与 00-AF?这意味着什么吗?
谢谢你的回答。快速提问:“在 UTF-16 中,字符长度以 16 位开头”——这是否意味着 UTF-16 不能表示字母数字字符,因为它们只是 8 位字符?
很好的答案,只有我有一个问题 - 波兰语真的使用不同的字母吗?我以为我们使用与英语相同的一个,只是增加了一些字母?
很好的解释。稍微解释一下 Unicode 是合适的。 Unicode 是一项大型标准工作,它为使用的每种主要语言的几乎所有字符和符号(数十万个字符)编目并指定了数字和字符关系。
H
Hans Passant

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

Unicode 的出现就是为了解决这场灾难。版本 1 以 65536 个代码点开始,通常以 16 位编码。后来在版本 2 中扩展到 110 万个代码点。当前版本是 6.3,使用了 110 万个可用代码点中的 110,187 个。这不再适合 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 编码和字节顺序,对文本渲染引擎是中性的。不幸的是,它是可选的,许多程序员声称他们有权省略它,所以事故仍然很常见。


S
Siddarth Kanted

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

https://i.stack.imgur.com/loX9M.jpg


Keypicture 来解释..Nice
@Mark,256 是当您考虑所有 ASCII 范围(包括扩展)时
@Thinker-101 没有“扩展 ASCII”这样的东西。有许多编码以不同的方式定义字节 128-255 的含义。 ASCII 定义字节 0-127 的含义。
P
Peter Mortensen

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 位数量。


我认为现在最常见的 Unicode 编码是 UTF-8。 UTF-8 将大多数代码点编码为 1、2 或 3 个字节。
N
Nikhil Katre

ASCII 和 Unicode 是两种字符编码。基本上,它们是关于如何用二进制表示差异字符的标准,以便它们可以在数字媒体中写入、存储、传输和读取。两者之间的主要区别在于它们对字符进行编码的方式以及它们用于每个字符的位数。 ASCII 最初使用七位来编码每个字符。后来通过扩展 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.

取自:http://www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs


这个答案非常不正确,而且术语完全错误。例如:“ASCII 和 Unicode 是两种字符编码”。不!它们是字符集。 “......它们是关于如何用二进制表示差异字符的标准”。不! Unicode 没有说明字符如何以二进制表示。这就是 UTF-8 等字符编码的作用。声称“Unicode 使用可变位编码”纯属无稽之谈。您从错误的文章中复制/粘贴,您应该删除此答案。这种错误信息不应发布在 SO 上。
H
Hasan Sefa Ozalp

贮存

给定数字仅用于存储 1 个字符

ASCII ⟶ 27 位(1 字节)

扩展 ASCII ⟶ 28 位(1 字节)

UTF-8 ⟶ 最小 28,最大 232 位(最小 1,最大 4 字节)

UTF-16 ⟶ 最小 216,最大 232 位(最小 2,最大 4 字节)

UTF-32 ⟶ 232 位(4 字节)

使用情况(截至 2020 年 2 月)

https://i.stack.imgur.com/nvZ0I.png


s
sphynx888

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


这个微不足道的重复“答案”为-1,对更早的先前答案没有添加任何内容。请不要像这样添加重复的混乱(以其他合法的方式获得代表)。
s
stackuser83

除了 UTF 如何是 ASCII 的超集之外,另一个需要了解的 ASCII 和 UTF 之间的区别在于磁盘文件编码和数据表示以及随机存储器中的存储。程序知道给定的数据应该被理解为 ASCII 或 UTF 字符串,方法是在数据的开头检测特殊的字节顺序标记代码,或者从程序员的意图中假设数据是文本,然后检查它是否存在表明它是文本的模式在一种或另一种文本编码中。

对十六进制数据使用传统的前缀符号 0x,基本的良好参考是 ASCII 文本以字节值 0x000x7F 开始,代表 possible ASCII character values 之一。 UTF 文本通常以 UTF8 的字节 0xEF 0xBB 0xBF 开头。对于 UTF16,使用起始字节 0xFE 0xFF0xFF 0xFE,文本字节的字节序由起始字节的顺序指示。不在可能字节值的 ASCII 范围内的字节值的简单存在也表明数据可能是 UTF。

还有其他 byte order marks 使用不同的代码来指示数据应被解释为以某种编码标准编码的文本。