C++ 字符编码混乱!

C++ 字符编码混乱!,c++,unicode,character,encoding,C++,Unicode,Character,Encoding,在理解UTF-8、UTF-16、ASCII和ANSI之间的差异时遇到了一些问题。在做了一些研究之后,我有了一些想法,但如果有人能够准确地解释它们之间的差异(包括每个字符的典型字符的字节表示),这将非常有用 我想我的问题归结为 非常感谢:)我发现Unicode可以很好地解释这一点。具体来说,它涵盖了历史(对本课程至关重要)、编码(UTF-8/16等)和代码页。从Joel on软件博客开始。O'Reilly CJKV信息处理包含大量字符集和字符编码的背景:当然,特别关注CJKV数据。在“UNIX上,

在理解UTF-8、UTF-16、ASCII和ANSI之间的差异时遇到了一些问题。在做了一些研究之后,我有了一些想法,但如果有人能够准确地解释它们之间的差异(包括每个字符的典型字符的字节表示),这将非常有用

我想我的问题归结为


非常感谢:)

我发现Unicode可以很好地解释这一点。具体来说,它涵盖了历史(对本课程至关重要)、编码(UTF-8/16等)和代码页。

从Joel on软件博客开始。

O'Reilly CJKV信息处理包含大量字符集和字符编码的背景:当然,特别关注CJKV数据。在“UNIX上,使用<代码> ReCdE < /COD> >或<代码> ICON>代码>将文本文件转换为另一种编码,或者在C或C++程序中使用<代码> ICOV函数(<代码> 3 ICONV</代码>)。
如果使用Perl,请使用
Encode
模块进行转换(例如
use Encode;print Encode(“utf-8”,“\xabfoo”)
)。如果您使用Python,请使用
unicode.encode
和/或
str.decode
(例如
print u'\xabfoo.encode('utf-8')
)。

快速尝试回答您的特定问题

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编码中的相同文本完全相同


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

了解一些有用的随机点:

  • 关于UTF-8和 ASCII是127 ASCII吗 字符以完全相同的格式编码 UTF-8中的方法相同(这也可能是 对于其他UTF方案,我很抱歉 不确定)换句话说,在 ASCII范围或字符,均为ASCII 和UTF-8完全相同 可互换的

    这一切的发生方式是 UTF-8是可变长度的;“第一” 127个字符由一个 每个单字节。除此之外,它 开始使用多个字节。怎么做 译码器知道是否要解释 字节作为单个ASCII字符或 作为多字节序列的一部分? 因为在开始的时候 字节遵循某些模式:a 开始时的零位表示它是一个 单字节字符,n 1位 表示此字节是 n字节序列

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

  • UTF-8也是XML的标准

相关问题(大多数投票采用unicode标记):
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.