C++以utf8编码输入中文

用C++的ofstream往utf8编码的文件中写入中文(以utf8编码),当写入英文时文件还是utf8编码,当输入中文后文件就不是utf8编码了,请问如何以utf8编码向文件中输入中文。

设置下locae
https://blog.csdn.net/lsldd/article/details/8637344

现在我们就分析一下,假如下面这段源码我们用UTF8格式保存(无Bom).分析一下控制台上显示的结果。

1 char* str= “我”;
2 printf(“%s\n”,str);
1.首先这个代码文件的文本中”我”这个汉字是以E68891三个字节编码的.

2.当编译器编译这段代码时,执行字符集默认是GBK,那么编译器要决定str的字节内容,就要把文本里保存的字节内容转为GBK,这里就有个值得注意的问题,既然要转换到GBK,就需要知道从什么格式转换到GBK,MSVC怎么知道源格式呢?方法只有一个就是分析你的源文件有没有有BOM,要是有就按照BOM它就认为原格式就是BOM指定的格式(不了解BOM可以先百度一下),如果没有BOM他就认为你的源码字符集是Locale关联的。刚才说了我们是用UTF8无BOM格式保存的源文件,所以编译器认为源码文本中的”我”是GBK编码保存的。

3.那从GBK到GBK,MSVC不会进行任何转换,这里有个小问题,提醒一下,这个代码应该是编译不通过的,因为GBK中汉字是2个字节表示的,而UTF8中是三个字节,所以编译器为了凑数会把”我”字后面的双引号给吃掉,转成了两个GBK汉字编码E688,9122(22是引号的UTF8编码),没有引号编译器就会报错,最简单的解决办法就是在在后面在加一个汉字变成偶数个就没问题了。

4.程序运行起来后printf输出到控制台,这时候用到的解析字符集也是GBK的,就会用内存里的E688,9122去GBK字符集里找到对应编码的汉字“鎴?”。这当然就错了。

  字符编码可以到这个网站去查询http://www.mytju.com/classcode/tools/encode_utf8.asp

在要输入的字符串前加 L 试试。例如:wcout << L“我爱我家”<< endl; 把 wcout 改成你的 文件对象