C++ Unicode 写文件流问题

不得不说,Visual C++确实不支持输出 Unicode 到文件流。但可以通过以下方式,保持数据不变,原样输出以达成这样的一个目的,事实它还挺好用的。如果你不熟悉编码的知识,这里要说明一下BOM(Byte Order Mark),它用来标记一个文件是按怎样的顺序来存储一个数据,用来解决高位的字节还低位的字节先后的问题。用调试器单步跟踪STL,可以发现wofstream 在写输出到文件以前,调用std::codecvt 对象来窄化输出的数据。具体是调用std::codecvt 对象来窄化输出的数据,它是造成Unicode字符串输出到文件流失败的原因,或者说是用户配置不到位造成的,或者说C++标准太死板了。
#include <iostream>
#include <fstream>

using namespace std;

static wchar_t * wmessage = L"show 中国國語 in unsigned short";

void main(){
    ofstream ofs("./log.txt", ios::binary);
    if( !ofs.bad() ){
        char *BOM = "\xFF\xFE";
        ofs.write( BOM, 2); // BOM of Little endian
        int len = wstring(wmessage).length();
        ofs.write( (char *) wmessage, len*2 );
        ofs.close();
    }
 }
为了解决,不能直接存储Unicode文件流这样一个问题,知道根源,解决也容易:写一个新的继承自codecvt的类,直接返回被转换的wchar_ts,什么也不做,绑定到 wofstream 文件流对象中。当文件流试图转换输出的数据时,将调用定制的codecvt 对象,原样地输出数据。MSVC环境中STL库的作者P. J. Plauger就提供了这样的代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值