求C++读取和显示unicode字符问题

纵横车 2015-12-16 07:39:25
有一个unicode格式的文件,想把它读取出来显示到控制台里,可是中文部分显示不出来,求解。
代码:
wcout.imbue(std::locale("chs"));
wfstream file = wfstream(L"d://asd.txt");
wstring str;
file>>str;
wcout<<str<<endl;

d://asd.txt:

运行结果:
...全文
387 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiu6332356 2015-12-18
  • 打赏
  • 举报
回复
楼上说的都对
  • 打赏
  • 举报
回复
听老赵的没错。。。
赵4老师 2015-12-17
  • 打赏
  • 举报
回复
第4行之前加一句file.imbue(locale(locale("chs")); 文件编码不用动。
encoderlee 版主 2015-12-16
  • 打赏
  • 举报
回复

如果你的TXT编码为Ansi,应该这样读:

#include <fstream>
#include <string>
#include <iostream>
using namespace std;

void main()
{
wcout.imbue(locale("chs"));
wstring wstr;
wifstream file(L"1.txt");
file.imbue(locale("chs"));
wstring str;
file >> str;
wcout << str << endl;
}




如果你的TXT编码为Unicode,应该这样读:(用到C++11的内容,需要VC2010或更高编译器)

#include <fstream>
#include <string>
#include <iostream>
#include <locale>
#include <codecvt>
using namespace std;

void main()
{
wcout.imbue(locale("chs"));
wstring wstr;
wifstream file(L"1.txt");
//0x10ffff是默认参数不用管。windows上说的Unicode实际上是UTF-16 LE,所以这里用little_endian指明是UTF16的小端序编码方式
//consume_header告诉codecvt需要自动处理BOM,即TXT文件起始处的头两个字节0xFF 0xFE,用来标识是什么类型编码的标记
file.imbue(locale(locale("chs"), new codecvt_utf16<wchar_t, 0x10ffff, (codecvt_mode)(little_endian | consume_header)>));
wstring str;
file >> str;
wcout << str << endl;
}


参考资料:http://blog.poxiao.me/p/unicode-character-encoding-conversion-in-cpp11/

64,688

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧