c++读取unicode文件的问题???????

partoneplay 2012-11-03 11:55:34
有两个文件1.txt和2.txt,内容是一样的,均为"古剑",不同之处在于1.txt为ASCI编码,2.txt为unicode编码
1.txt的二进制形式表示为B9 C5 BD A3
2.txt的二进制形式表示为FF FE E4 53 51 52
有如下代码(最简单的示例)

int main()
{
//locale loc(".936");

wifstream wfin("1.txt", ios_base::binary | ios_base::in);
//wfin.imbue(loc);
//wcout.imbue(loc);
wchar_t wch;
//wfin>>wch;

while(!wfin.eof())
{
wfin>>wch;
wcout<<wch;
}

system("pause");
return 0;
}

输出为"古剑",正常显示
若换为2.txt,SQRR,这个两个逗号之间用鼠标选择一下,有六个符号
调试时发现wch的值为:00FF 00FE 00E4 0053 0051 0052
unicode编码中前两个字节为BOM,用于标示为unicode文件,在网上查了其他一些资料
添加了上边注释掉的东西,但是结果依然不对;输出结果为空,while循环直接跳过了;
再次注释掉while循环前面的wcin>>wch;输出结果为“古剑剑”,十分的不理解
请问到底是什么情况,求助解答一下;
...全文
321 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
漫步者、 2012-11-04
  • 打赏
  • 举报
回复
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
	//locale loc(".936");

	wifstream wfin("d:1.txt", ios_base::binary | ios_base::in);
	//wfin.imbue(loc);
	//wcout.imbue(loc);
	wchar_t wch;
	//wfin>>wch;

	while(!wfin.eof() && (wfin>>wch))
	{
		wcout<<wch;
	}
	cout<<endl;

	system("pause");
	return 0;
}

partoneplay 2012-11-04
  • 打赏
  • 举报
回复
引用 1 楼 ganpengjin1 的回复:
C/C++ code1234567891011121314151617181920212223#include <fstream>#include <iostream>using namespace std;int main(){ //locale loc(".936"); wifstream wfin("d:1.txt", ios_base::binary……
这个D:1.txt是什么编码格式的,虽然解决了“古剑剑”问题,但unicode编码的文件依然不行,另存为,编码格式选择unicode,直接跳过循环
partoneplay 2012-11-04
  • 打赏
  • 举报
回复
引用 4 楼 ganpengjin1 的回复:
引用 2 楼 partoneplay 的回复:引用 1 楼 ganpengjin1 的回复:C/C++ code1234567891011121314151617181920212223#include <fstream>#include <iostream>using namespace std;int main(){ //locale loc(".936"); ……
txt文件也有编码格式的,ASCI,Unicode的编码都有
漫步者、 2012-11-04
  • 打赏
  • 举报
回复
引用 2 楼 partoneplay 的回复:
引用 1 楼 ganpengjin1 的回复:C/C++ code1234567891011121314151617181920212223#include <fstream>#include <iostream>using namespace std;int main(){ //locale loc(".936"); wifstream wfin("d:1……
不是从txt中读取数据吗
Eleven 2012-11-04
  • 打赏
  • 举报
回复
MFC中很容易读取Unicode编码的文件
try
	{
		CFile file(_T("F:\\2.txt"), CFile::modeRead);
		DWORD dwSize = file.GetLength();
		wchar_t* pBuf = new wchar_t[dwSize + 1];
		memset(pBuf, 0, sizeof(wchar_t) * (dwSize + 1));
		file.Seek(2, CFile::begin);
		file.Read(pBuf, dwSize);
		file.Close();
		MessageBoxW(NULL, pBuf, NULL, 0);
		delete[] pBuf;
		pBuf = NULL;
	}
	catch(CException* e)
	{
		e->ReportError();
		e->Delete();
	}

64,682

社区成员

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

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