(21条消息) ISO/IEC 10646、Unicode及UTF-16、UTF-8_weixin_34256074的博客-CSDN博客
(21条消息) %s 与 %ls的区别_Alex-xt的博客-CSDN博客_%ls
(21条消息) wcout 中文输出问题_onecing的博客-CSDN博客_wcout输出中文
先按顺序耐心看完上面三篇,再结合下面例子分析,相信你会对中文编码有一个全面的了解
创建两个txt分别为gbk,utf8编码里面分别输入中文
#include < iostream >
#include <string>
#include <fstream>
#include <locale>
using namespace std;
int main(int argc, char* argv[])
{
/*
中文
GB2312 D6D0CEC4
BIG5 A4A4A4E5
GBK D6D0CEC4
GB18030 D6D0CEC4
Unicode 00004E2D00006587
UTF-8 E4B8ADE69687
UTF-16 BE4E2D6587
UTF-16 LE2D4E8765
*/
setlocale(LC_ALL, "");//c wprintf()本地化
std::wcout.imbue(std::locale(""));//c++ wcout本地化
wfstream aaa("./22GBK.txt");//文本为中文
fstream bbb("./33UTF8.txt");
char str[] = " 中文"; //我的电脑win10本地为GBK的编码
wchar_t wstr[] = L"中文"; //这个为UTF16编码
string str1 = " 中文";
string str2;
wstring wstr1 = L"中文";
wstring wstr2;
aaa.imbue(std::locale("")); //每个流都要本地化
aaa >> wstr2;//不本地化的话只读一个字节,本地化后会读取两个
bbb >> str2;
/*
wchar_t temp;
while (aaa.get(temp))//不本地化也是只读一个字节
{
}
*/
cout << "str:" << str << endl;
wcout << "wstr:" << wstr << endl;
cout << "str1:" << str1 << endl;
wcout << "wstr1:" << wstr1 << endl;
wcout << "GBKwstr2:" << wstr2 << endl;//不本地化的话,两个字节中第一个字节为0x00??不会输出
cout << "UTF8str2:" << str2 << endl;//因为是UTF8编码,控制台是GBK的所以这个无法输出
system("pause");
return 0;
}
本地化前:
可以看到wstring<<只读取一个字节并放到宽两个字节的wstring中
本地化后:
wstr2正常了
除了最后一行,其它都正常了