GB2312

原始ASCII码范围是0-7F,包括英文字母、阿拉伯数字和标点符号等字符

拓展ASCII码拓展了80-FF

GB2312向下兼容ASCII,每个汉字以两个字节来表示,第一个字节称为“高位字节”(也称“区字节)”,第二个字节称为“低位字节”(也称“位字节”)。“高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上 0xA0)。


UNICODE

UNICODE是一个字符集,它规定了符号的二进制代码

UTF-32

简单粗暴,直接使用4个字节储存所有字符。

UTF-16

UTF-16是一种变长编码,以16位无符号整数为单位,对于0-FFFF之间的字符,使用2个字节储存,对于10000-10FFFF之间的字符,使用4个字节储存,并且UTF-16没有任何单字节字符,所以并不兼容ASCII。

UTF-8

UTF-8支持单字节,可以向下兼容ASCII码,具体编码方式如下:

UNICODE编码 UTF-8字节流
000000 - 00007F 0xxxxxxx
000080 - 0007FF 110xxxxx 10xxxxxx
000800 - 00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

如上所诉,由于UTF-16不支持单字节字符,在网络中传输为了节省资源一般使用UTF-8,文件中中文字符多也可以使用UTF-16,解析速度更快。

BOM(Byte Order Mark)

字节顺序标记,插入到UNICODE编码数据开头的特殊标记,表示了数据的编码类型

编码 二进制数据
UTF-8 EF BB BF
UTF-16LE FF FE
UTF-16Be FE FF

UTF-16LE为小端存储,UTF-16Be为大段存储。


在C语言中使用宽字符

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<locale.h>


int main() {

setlocale(LC_ALL, "");

wchar_t str[] = L"测试";

wprintf(L"%s\n", str);
system("pause");


}