长度
c++ 中 char 占1字节,而wchar_t占2字节。
一个ansi字符 占1个字节
一个unicode字符 占2个字节
一个utf-8字符 不定长
一个gb2312字符 不定长
编码
拿“你好”这两个字来说
如果你的电脑使用gb2312编码
string s = "你好";
那么字符串的长度为4个字节
二进制为 (11000100 11100011 10111010 11000011)
对应的十进制为 -60 -29 -70 -61
如果你的电脑使用utf8编码
string u = "你好";
那么字符串长度为6个字节
二进制为 (11100100 10111101 10100000 11100101 10100101 10111101)
对应的十进制为 -28 -67 -96 -27 -91 -67
打印
如果我们使用gb2312的电脑来打印utf8 编码的字符串 就会出现 乱码 。
现在我们复现一下,我这台电脑使用的是gb2312编码 !
int main(int argc, char* argv[]) {
char gb2312[5] = { -60,-29,-70,-61,'\0' };
char utf8[7] = {-28,-67,-96,-27,-91,-67,'\0' };
cout << gb2312 << endl;
cout << utf8<<endl;
return 0;
}
输出
你好
浣犲ソ
显然使用gb2312打印utf8会出现乱码。
转化
你可以把utf8转换成gb2312解决乱码问题,但我认为最好是把这两个种字符全都转成 unicode,因为 unicode 是固定长度的。
unicode 是2个字节 , wchar_t 也是2个字节, 所以我想你应该明白了。
我们可以使用wchar_t来存储unicode字符,这样就统一了,不管是什么字符都可以存成unicode。
下面代码将utf8 转 unicode 使用wchar_t 存储
#include <codecvt>
int main(int argc, char* argv[]) {
char utf8[7] = {-28,-67,-96,-27,-91,-67,'\0' };
wstring unicode = std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(utf8);
wcout <<unicode<<endl;
return 0;
}
输出
你好
PS wstring f = L"你好"; c++直接将这两个字符保存为unicode。