字符集和编码

编码

代码页

  • 代码页即编码的值,同样的字符,在不同的代码页中,值是不同的;
  • 最常用的代码页有 GBK,BIG5,UTF-8,UTF-16;
  • GBK 是 GB2312 的扩展,代码页都是 CP936
  • GB18030 是 GBK 的扩展,代码页是 CP54936 , 一般低端设备不会支持这么全的编码;
  • GB18030,GBK,GB2312 是向下兼容的,即同一字符的值在不同编码中都相同;
  • BIG5 是繁体字的代码页;

编码格式

  • GBK 只有一种编码方案,ascii 码占一个字符,中文字符占两个字节;
  • UNICODE 有三种编码方案:UTF-8,UTF-16,UTF-32;
    • 通常所说的 UNICODE 是指 UTF-16 编码方案,UTF-8,UTF-32 需要特指;
    • UTF-8 字符是以 8 位序列来编码的,用一个或几个字节来表示一个字符,ASCII 码占一个字节;
    • UTF-16UTF-32 分别是 UNICODE 的 16 位和 32 位编码方式;

编码转换

  • GBK 等与 UTF-8 之间都必须通过 Unicode 编码(即 UTF-16)才能相互转换;

编程相关

char / wchar_t

  • 定义 char * 类形的窄字符串时,采用的是内码编码,即源文件的编码。在 Windows 中文系统下即 GBK 编码,因为文本文件默认以 GBK 编码保存;
  • 定义 wchar_t * 类型宽的字符串时,采用的 UNICODE 编码,在 Windows 中文系统下即 UTF-16 格式,在 Linux 下采用 UTF-32 格式;

string / wstring

  • string 一般用来存储 GBK, UTF-8 编码;
  • wstring 一般用来存储 UTF-16 编码;
  • 通常用到的 string2wstring 编码转换即 GBK->UNICODE;wstirng2string 即 UNICODE->GBK;

printf / wprintf

  • printf 格式化输出 %s 时,可输出 GBK 编码;格式化输出 %S%ws 时,可输出 UNICODE 编码;
  • wprintf 格式化输出 %s 时,可输出 UNICODE 编码;格式化输出 %S%ws 时,可输出 GBK 编码;

OS 相关

系统内码

  • Windows 中文系统默认的内码是 GBK ,即以 GBK 解析字节流;
  • Linux 系统默认的内码是 UTF-8 ,即以 UTF-8 解析字节流;

内部存储

  • Windows 中 UNICODE 默认采用 UTF-16 格式存储,即一个字符存放于两个字节;
  • Linux 系统中 UNICODE 默认采用 UTF-32 格式存储,即一个字符存放于四个字节;