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.

非常感谢 :)

4

6 回答 6

12

我发现Joel关于 Unicode 的文章很好地解释了这一点。具体来说,它涵盖了历史(本主题所必需的)、编码(UTF-8/16 等)和代码页。

于 2009-05-21T11:32:23.020 回答
4

快速尝试回答您的具体问题。

1:某种位组合代表某个字符。单个字符可以存储在多个字节中。

2:您提到的编码的简要信息和差异。

ASCII
包括 128 个字符的定义。

ANSI
具有比 ASCII 更多的字符,但仍适合八位字节。需要代码页。

UTF-8
这可用于表示任何 Unicode 字符。Unicode 字符比 ASCII 字符多得多。它将每个字符存储在一到四个八位字节的数据中。

UTF-16
与 UTF-8 类似,但基本单位是 16 位。如果您只是使用英语,那么您在每个字符上浪费了 8 位。

3:代码页是向计算机指定哪个(位组合)指代哪个字符。Unicode 不需要代码页,因为每个字符都有自己独特的位组合。ANSI 有代码页,因为它只有 256 个可用字符。例如,如果您使用的是阿拉伯语计算机,您会将阿拉伯语设置为代码页,并且可以显示阿拉伯语字符。

4:转换方法取决于您要转换的字符集和使用的代码页(如果有)。有些转换可能是不可能的。UTF-8 向后兼容 ASCII,这意味着如果您的文本仅包含前 128 个美国字符,则它与 ASCII 编码中的相同文本完全相同。

这个答案是临时的,可能有错误,欢迎指正。

于 2009-05-21T12:13:05.823 回答
2

从每个软件开发人员绝对、肯定必须了解 Unicode 和字符集的绝对最小值开始(没有任何借口!) (来自 Joel on Software 博客)

于 2009-05-21T11:33:19.523 回答
0

O'Reilly CJKV 信息处理包含很多关于字符集和字符编码的背景知识:当然,特别关注 CJKV 数据。我发现让我的理解超越“如何让 !*!**#@ 欧元符号正确显示?”很有用。

于 2009-05-21T11:55:28.183 回答
0

在 Unix 上,使用名为recodeor的程序iconv将文本文件转换为另一种编码,或者在 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'))。

于 2009-05-21T11:56:38.103 回答
0

一些有用的随机点:

  • 关于 UTF-8 和 ASCII 的一个有趣的事情是 127 个 ASCII 字符在 UTF-8 中以完全相同的方式编码(这也可能是其他 UTF 方案的情况,我不确定)换句话说,在ASCII 范围或字符,ASCII 和 UTF-8 是完全可以互换的。

    出现这种情况的方式是 UTF-8 是可变长度的;“第一个”127 个字符分别由一个字节表示。除此之外,它开始使用多个字节。解码器如何知道是将字节解释为单个 ASCII 字符还是多字节序列的一部分?因为字节开头的位遵循某些模式:开头的 0 位表示它是一个单字节字符,n 1 位表示该字节是n字节序列的开头。

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

  • UTF-8 也是 XML 的标准。

于 2010-03-26T13:52:20.573 回答