字符编码

ANSI多字节编码:

ASCII:美国信息交换标准代码,早期计算使用的字符编码;特点:一个字母或符号只需要一个字节存储;

ANSI:美国国家标准学会,主要是应对多国家本地化文字的问题;特点:多字节编码方式,系统里的英文和符号就使用单字节的 ASCII(0x00~0x7f),而对于汉字之类的本地化字符编码,就采用 0x80~0xFF 范围内的多个字节来表示,这样既能兼容 ASCII ,又能正常使用本地化语言文字。对于大陆国标码已经发展了好几代,一般对简体中文的文本选择 GBK 或 GB18030 编码都是可以正常显示的。

Unicode系列编码:

Unicode编码主要是为了解决ANSI编码中0x80~0xff中各国本地化语言各自为战,没有统一的标准,造成多国语言的冲突;Unicode字符编码是对全球语言统一分配编码区间,各种语言字符互相不冲突,都可以兼容使用;

  1. Unicode 编码系统,可分为编码方式和实现方式两个层次。所谓编码方式就是采用几个字节表示一个字符。其中UTF-8是灵活的变长编码,对于 ASCII 使用一个字节编码,其他本地化语言文字用多个字节编码,最长可以到 6 个字节编码一个字符。
  2. UTF-16:兼容 UCS-2,一般都是两字节表示一个字符,对于超出两字节的国际码字符,使用一对两字节来表示。在存储时,按两个字节的排布顺 序,可以分为 UTF-16LE(Little Endian,小端字节序)和UTF-16BE(Big Endian,大端字节序),微软所说的 Unicode 默认就是 UTF-16LE。
  3. UTF-32:同 UCS-4,因为用四个字节表示一个字符,所以不需要考虑扩展了。这种编码方式简单,但也特别浪费空间,

在 C++ 中,以前通常使用 char 表示单字节的字符,使用 wchar_t 表示宽字符,对国际码提供一定程度的支持。 char * 字符串有专门的封装类 std::string 来处理,标准输入输出流是 std::cin 和 std::cout 。对于 wchar_t * 字符串,其封装类是 std::wstring,标准输入输出流是 wcin 和 wcout。
        Windows 系统里的宽字符是两个字节,就是 UTF-16;而 Unix/Linux 系统里为了更全面的国际码支持,其宽字符是四个字节,即 UTF-32 编码。
        MFC 一般用自家的 TCHAR 和 CString 类支持国际化,当没有定义 _UNICODE 宏时,TCHAR = char,当定义了 _UNICODE宏 时,TCHAR = wchar_t,CString 内部也是类似的。

在 Windows 系统里源文件是 GBK ,其命令行编码也是 GBK;在 Linux 系统里源文件是 UTF-8,其命令行编码也是 UTF-8。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章