Unicode写入txt的问题

真是一入Unicode深似海,一个简单的写txt都有想不到的坑。

CString outs;

errno_t err;
                FILE* fp;
                err= _wfopen_s(&fp,filename, L"w+,ccs = UNICODE");
          fwrite(outs, sizeof(wchar_t), outs.GetLength(), fp) ;

fclose(fp);

这么写看似没有问题,但实际上还有两个问题

一。乱码

这个主要问题困扰我很久,怎么写都乱码,开始发现“\r\n”没有加L,心想真粗心,奇怪的是这么写VS也认为正确。但是加了L依旧乱码,看了一下MSDN

在文本模式下,输入时,回车-换行组合将转换为单一的换行,输出时,换行字符将转换为回车-换行组合。 当 Unicode 流 I/O 函数在文本模式(默认设置)下运行时,源或目标流将假定为一系列多字节字符。 因此,Unicode 流输入函数将多字节字符转换为宽字符(就像调用 mbtowc 函数一样)。 出于同一原因,Unicode 流输出函数将宽字符转换为多字节字符(就像调用 wctomb 函数一样)。

b
在二进制(未转换)模式下打开;不进行涉及回车和换行字符的转换。

终于明白了都是t模式在捣蛋,而且这个模式是默认的必须加b才能不转换

二就是默认打开编码的问题,如果没有BOM默认是按多字节打开的,那依旧是很酸爽的感觉,所以必须加上这个头

WORD wSignature = 0xFEFF;
                fwrite(&wSignature, 2, 1, fp);

那么就完美解决了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值