字符编码混乱!

时间:2009-05-21 11:29:07

标签: c++ unicode character encoding

在解决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.

非常感谢:)

6 个答案:

答案 0 :(得分:12)

我在Unicode上找到了Joel's article来解释这个问题。具体来说,它涵盖了历史(对于这个主题至关重要),编码(UTF-8/16等)和代码页。

答案 1 :(得分: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编码中的相同文本完全相同。

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

答案 2 :(得分:2)

答案 3 :(得分:0)

O'Reilly CJKV信息处理包含很多关于字符集和字符编码的背景知识:当然,特别注意CJKV数据。我发现除了“我如何得到一个!*!**#@ Euro符号以便正确显示?”之后我的理解很有用。

答案 4 :(得分: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'))。

答案 5 :(得分:0)

一些有用的随机要点:

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

    这就是这样的 UTF-8是可变长度的;首先” 127个字符由a表示 每个单字节。除此之外,它 开始使用多个字节。如何 解码器知道是否解释a 字节作为单个ASCII字符或 作为多字节序列的一部分? 因为位在开头 字节遵循某些模式:a 开头的零位意味着它是一个 单字节字符, n 1位 意味着这个字节是开头的 一个 n 字节序列。

  • 此外,不同的语言会 将其原生字符串转换为 输出时的编码不同 例如,他们打印出来 文件或在屏幕上。因此,如果 你有兴趣 语言之间的可互换性 和平台,你应该永远 详细说明你的喜好 要输出的语言字符串类型。否则你会收到奇怪和意外的错误!

  • UTF-8也是XML的标准。