字符编码混淆!

3

我对UTF-8,UTF-16,ASCII和ANSI之间的区别有些困惑。经过一些研究,我有了一些想法,但如果有人能够准确地解释它们之间的区别(包括每种编码方式下典型字符的字节表示),那将非常有用。

我的问题可以归结为:

1) How do each of the above store characters as bytes
2) What are the differences between the above standards
3) What is a code page
4) Method of converting characters between the various types.
非常感谢 :)

相关问题(Unicode标签中最多票数):https://dev59.com/2HVC5IYBdhLWcg3wpi98 - mghie
6个回答

12

我发现Joel的文章很好地解释了这个问题。具体而言,它涵盖了历史(这个主题非常重要)、编码(UTF-8/16等)和代码页。


4
为了快速回答您的问题:
1:一定的比特组合表示一个特定的字符。一个单独的字符可能会被存储在多个字节中。
2:你提到的这些编码的简单介绍和区别。
ASCII ASCII包含128个字符的定义。
ANSI ANSI比ASCII有更多的字符,但仍可以适用于一个八位字节。需要代码页。
UTF-8 这种编码可以用来表示任何Unicode字符。Unicode字符比ASCII字符多得多。它将每个字符存储在1到4个数据字节中。
UTF-16 类似于UTF-8,但基本单位是16位。 如果你只是使用英语,那么你在每个字符上浪费了8个比特。
3:代码页指定计算机中哪些(比特组合)对应哪个字符。Unicode不需要代码页,因为每个字符都有自己独特的比特组合。ANSI有代码页,因为它只有256个可用字符。例如,如果你在阿拉伯语电脑上,你会把阿拉伯语设置为代码页,并且可以显示阿拉伯字符。
4:转换方法取决于你要从哪个字符集转换和转换到哪个字符集以及所使用的代码页(如果有)。有些转换可能不可能。UTF-8向后兼容ASCII,这意味着如果你的文本只包含前128个美国字符,那么它与ASCII编码中的相同文本完全相同。
此答案是现场问题回答,可能会存在错误,欢迎更正。


0
一些有用的随机点需要知道:
  • 关于UTF-8和ASCII的有趣之处在于,127个ASCII字符在UTF-8中的编码方式完全相同(其他UTF方案可能也是如此,我不确定)。换句话说,在ASCII字符范围内,ASCII和UTF-8是完全可互换的。

    这种情况的发生是因为UTF-8是可变长度的;前127个字符由一个字节表示。超过这个范围,它开始使用多个字节。解码器如何知道将一个字节解释为单个ASCII字符还是多字节序列的一部分?因为字节开头的位遵循某些模式:起始的零位表示它是单字节字符,n个1位表示该字节是一个n字节序列的开头。

  • 此外,不同的语言在输出其本地字符串时会将其转换为不同的编码方式,例如在文件或屏幕上打印它们。因此,如果您对语言和平台之间的互换性感兴趣,您应该始终指定您希望输出的语言字符串类型。否则,您将会得到奇怪和意外的错误!

  • UTF-8也是XML的标准。


0

O'Reilly CJKV信息处理包含大量关于字符集和字符编码的背景知识,特别关注CJKV数据。当然,我发现它对于让我超越“如何使一个! *!**#@欧元符号正确显示?”这一点非常有用。


0

在Unix上,使用名为recodeiconv的程序将文本文件转换为另一种编码,或在您的C或C++程序中使用iconv函数(man 3 iconv)。

如果您使用Perl,请使用Encode模块进行转换(例如:use Encode; print encode("utf-8", "\xabfoo"))。如果您使用Python,请使用unicode.encode和/或str.decode(例如:print u'\xabfoo'.encode('utf-8'))。


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