在使用redis时,发现存入的中文字符都变成了编码形式"\xE4\xB8\xAD",于是好奇这是什么编码呢,\xXX又是什么表示形式呢?

Part1

我们首先来看下汉字字的多种编码:

1
2
3
4
5
6
7
8
GB2312      D6D0
BIG5 A4A4
GBK D6D0
GB18030 D6D0
Unicode 00004E2D
UTF-8 E4B8AD
UTF-16BE 4E2D
UTF-16LE 2D4E

下面是我们经常看到的各种编码表示形式

1
2
3
4
5
6
7
8
9
10
11
\u4E2D

\U00004E2D

中

中

\xE4\xB8\xAD

%e4%b8%ad

可以看出,这几种表示形式虽然各不相同,但无非是Unicode的4E2D码点或UTF-8的E4B8AD码点。其中中中的200134E2D对应的十进制数值。

由于各种编码的码点经常使用十六进制的形式来表示,所以在各类使用场景下就有了上述各种不同的表示形式。

Part2

打开VSCode,新建文本文件并输入汉字,借助Hex Editor插件可以看到文件对应的二进制格式。

使用UTF-8 with BOM编码时,开头的EF BB BF表示这是UTF-8编码。

1
2
3
4
5
// UTF-8
E4 B8 AD

// UTF-8 with BOM
EF BB BF E4 B8 AD

使用UTF-16 LE编码时,开头的FF FE表示使用小端对齐。

使用UTF-16 BE编码时,开头的FE FF表示使用大端对齐。

1
2
3
4
5
// UTF-16 LE
FF FE 2D 4E

// UTF-16 LE
FE FF 4E 2D

参考