为什么Utf8兼容ascii

14

UTF-8中的AU+0041 LATIN CAPITAL LETTER A,而在ASCII中则是065

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


1
任何以ASCII编码的文本文件都可以解码为UTF-8,以获得完全相同的结果。 - Esailija
1
你正在比较十进制和十六进制。65十进制等于41十六进制。UTF-8几乎总是以十六进制列出。 - rocketsarefast
3个回答

34

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

UTF-8 保留这些确切的映射。ASCII 中由 01101011 表示的字符在 UTF-8 中也由同一字节表示。所有其他字符都以多字节序列编码,在其中每个字节都具有最高位设置;即 UTF-8 中所有非 ASCII 字符的每个字节都是 1xxxxxxx 的形式。


你能解释一下如果只支持ASCII文件的应用程序读取UTF8文件会发生什么吗?具体来说,当它读取0041(十六进制)的第一个字节时,它应该做什么? - Isara Rungvitayakul
6
“0041”这个词究竟是指什么?Unicode字符U+0041还是字节序列0x00 0x41?如果是前者,那就是字母“A”,在UTF-8中与ASCII相同,所以完全没有问题。如果是后者,那就是一个NUL(空字符)字节后面跟着一个“A”,这在ASCII和UTF-8中都是相同的。我觉得你还没有真正理解重点,建议阅读每个程序员绝对必须知道的有关编码和字符集处理文本的知识 - deceze

8
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具有多字节编码的字符集部分。

1
请注意,只有7位ASCII字符集与Unicode和UTF-8兼容。您应该删除对Unicode的提及,或者在此上下文中定义“兼容”的含义。 - Raffi

6

为什么:

因为所有内容都已经是ASCII编码,而且有一个向后兼容的Unicode格式,使得采用更容易。将程序转换为使用UTF-8比UTF-16要容易得多,并且该程序通过仍然与ASCII一起工作来继承向后兼容的特性。

如何:

ASCII是7位编码,但始终存储在字节中,即8位。这意味着1位始终未使用。

UTF-8简单地使用那个额外的位来表示非ASCII字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接