wfstream与汉字问题

k2000 2007-12-26 09:02:29
请教,下面的代码为什么不能输出汉字
wfstream outfile;
outfile.open(L"c:\\test.txt",wios::out|wios::trunc);
outfile << L"test你好";
outfile.close();
...全文
905 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
thy38 2009-09-08
  • 打赏
  • 举报
回复
不结贴不厚道
loops 2007-12-26
  • 打赏
  • 举报
回复
这么搞吧。

locale loc("chs");
outfile.imbue(loc);
outfile<<L"test你好";


帮你自动把unicode转换成gbk输出。
Jim_King_2000 2007-12-26
  • 打赏
  • 举报
回复
That's very easy... to write a Unicode file you do:

// open wide-char file (yes: Unicode files must be opened as binary!)
std::wofstream file("myfile.uni", std::ios_base::binary);

// choose UTF-16LE encoding
boost::utf::imbue_utf16le(file);

// write byte order mark
file << boost::utf::bom;


To read:

std::wifstream file("myfile.uni", std::ios_base::binary);
boost::utf::imbue_utf16le(file);
file >> boost::utf::bom;


http://groups.google.com/group/microsoft.public.vc.stl/browse_frm/thread/1d191588f45632ed/98e1f01fa535d0f9#98e1f01fa535d0f9
k2000 2007-12-26
  • 打赏
  • 举报
回复
如果是
wstring s(L"test你好");
outfile<<s;
wstring也需要处理吗?
k2000 2007-12-26
  • 打赏
  • 举报
回复
如果是wstring s(L"test你好");outfile<<s;呢?wstring 是否需要处理?
飞哥 2007-12-26
  • 打赏
  • 举报
回复
:(
放着ifstream不用
laolaoliu2002 2007-12-26
  • 打赏
  • 举报
回复
L其实是定义一个unsigned short,编译器看到L"abcd"的形式,会取中字符串的每一个字节,然后做一个char到unsigned short的转换,对于英文字母,这样转换完成之后正好是该英文字符在unicode字符集中的代码,所以没有问题。
可是对于汉字,就有问题了,如果按照 “ 取每一个字节,转换成 unsigned short”的转换规则,就会成为乱码,导致输出流错误。
你应该先调用mbsrtowcs()把你输入的汉字转换成wchar_t的形式,然后再调用 << 输出。
#include <fstream>

using namespace std;

int main()
{
wofstream file;
const char * str = "安定风格上轨道风格杀";
wchar_t dst[100];


mbsrtowcs(dst, &str, strlen(str), NULL);

file.open("111.txt",ios::app);

if (file)
{
file<<L"asdfasdf"<< endl;
file << dst << endl;
file.close();
}
return 0;
}
laolaoliu2002 2007-12-26
  • 打赏
  • 举报
回复
我也没试过,你可以试一下看看^_^
laolaoliu2002 2007-12-26
  • 打赏
  • 举报
回复
wfstream是一个名不符实的命名,它并不用于对于宽字符(wide character)文件的读写,它处理的是多字节(mutilbytes character)文件。实际上,标准库并没有直接提供对于宽字符文件的读写。如果你正在进行 wchar_t 类型的编程,那么进行文件IO时一定要小心,使用wfstream也许结果和你想象中的不太一样

我是这样理解的,不知道对不对,就是wfstream还是按单字节去读写的,而不是按宽字节去读写的,而这不是根本原因,根本原因是"test你好"这段是mbs编码形式,不能单纯靠L前缀去改变它成为unicode,需要mbsrtowcs来转换一下
k2000 2007-12-26
  • 打赏
  • 举报
回复
那怎么办?
laolaoliu2002 2007-12-26
  • 打赏
  • 举报
回复
wfstream是一个名不符实的命名,它并不用于对于宽字符(wide character)文件的读写

65,176

社区成员

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

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