为啥utf8和ascii兼容

Posted

技术标签:

【中文标题】为啥utf8和ascii兼容【英文标题】:Why Utf8 is compatible with ascii为什么utf8和ascii兼容 【发布时间】:2013-04-04 15:40:44 【问题描述】:

A 在 UTF-8 中是 U+0041 LATIN CAPITAL LETTER A。 ASCII 中的A065

UTF-8 如何与 ASCII 向后兼容?

【问题讨论】:

任何以 ASCII 编码的文本文件都可以解码为 UTF-8 以获得完全相同的结果。 您在比较十进制和十六进制。 12 月 65 日 = 41 十六进制。 utf-8 几乎总是以十六进制列出。 【参考方案1】:

ASCII 仅使用 8 位字节的前 7 位。所以从0000000001111111 的所有组合。此范围内的所有 128 个字节都映射到特定字符。

UTF-8 保留这些精确的映射。 ASCII 中01101011 表示的字符在 UTF-8 中也用相同的字节表示。所有其他字符都以多个字节的序列编码,其中每个字节都具有最高位集;即 UTF-8 中所有非 ASCII 字符的每个字节的格式为 1xxxxxxx

【讨论】:

你能解释一下如果只支持 ASCII 文件的应用程序读取 UTF8 文件会发生什么。具体来说,它在读取 0041(十六进制)的第一个字节时应该做什么。 “0041”到底是什么意思? Unicode 字符 U+0041?字节序列0x00 0x41?如果是前者,那就是后者的“A”,它以UTF-8编码与ASCII编码相同,所以根本没有问题。如果是后者,那将是一个NUL 字节后跟“A”,这在 ASCII 中与在 UTF-8 中相同。我想你还没有完全明白这一点,我建议你阅读What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text。【参考方案2】:

为什么:

因为一切都已经是 ASCII 并且具有向后兼容的 Unicode 格式使得采用变得更加容易。将程序转换为使用 UTF-8 比转换为 UTF-16 容易得多,并且该程序通过仍然使用 ASCII 继承了向后兼容的特性。

如何:

ASCII 是 7 位编码,但始终以 8 位字节存储。这意味着 1 位一直未被使用。

UTF-8 只是使用那个额外的位来表示非 ASCII 字符。

【讨论】:

【参考方案3】:

Unicode 向后兼容 ASCII,因为 ASCII 是 Unicode 的子集。 Unicode 只是使用 ASCII 中的所有字符代码并添加更多。

虽然字符代码在 Unicode 中通常写为 0041,但字符代码是数字,因此 0041 与(十六进制)41 的值相同。

UTF-8 不是字符集,而是与 Unicode 一起使用的编码。它恰好也与 ASCII 兼容,因为用于多字节编码的代码位于未使用的 ASCII 字符集中。

请注意,只有 7 位 ASCII 字符集兼容 Unicode 和 UTF-8,基于 ASCII 的 8 位字符集,如 IBM850 和 windows-1250,使用 UTF 的部分字符集-8 具有多字节编码的代码。

【讨论】:

"请注意,只有 7 位 ASCII 字符集与 Unicode 和 UTF-8 兼容":您应该删除对 Unicode 的提及,或者您必须定义“兼容”的含义这个上下文

以上是关于为啥utf8和ascii兼容的主要内容,如果未能解决你的问题,请参考以下文章

Unicode和其他编码兼容性

什么是UTF-8编码?

不兼容的字符编码:ASCII-8BIT 和 UTF-8

不同子系统采用不同MySQL编码LATIN1和UTF8的兼容

为啥安卓和iOS不兼容

IE浏览器为啥会出现兼容模式?