我们先要弄明白原始字符串里的字符用的是何种编码方式,运行如下
string tmp = "你好world"; for(int i=0;i<tmp.size();++i) { printf("%0X ",tmp.at(i)); }
程序输出:
FFFFFFE4 FFFFFFBD FFFFFFA0 FFFFFFE5 FFFFFFA5 FFFFFFBD 77 6F 72 6C 64
很明显,原始的字符串是使用UTF-8编码的,因为它满足UTF-
8
的编码规则:
1
)对于单字节的符号,字节的第一位设为
0
,后面
7
位为这个符号的unicode码。因此对于英语字母,UTF-
8
编码和ASCII码是相同的。
2
)对于n字节的符号(n>
1
),第一个字节的前n位都设为
1
,第n+
1
位设为
0
,后面字节的前两位一律设为
10
。剩下的没有提及的二进制位,全部为这个符号的unicode码。
1字节:0xxxxxxx
2字节:110xxxxx 10xxxxxx
3字节:1110xxxx 10xxxxxx 10xxxxxx
4字节:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx