为啥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 中的A
是065
。
UTF-8 如何与 ASCII 向后兼容?
【问题讨论】:
任何以 ASCII 编码的文本文件都可以解码为 UTF-8 以获得完全相同的结果。 您在比较十进制和十六进制。 12 月 65 日 = 41 十六进制。 utf-8 几乎总是以十六进制列出。 【参考方案1】:ASCII 仅使用 8 位字节的前 7 位。所以从00000000
到01111111
的所有组合。此范围内的所有 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兼容的主要内容,如果未能解决你的问题,请参考以下文章