今天在用fwrite写unicode文件的时候出现了一个问题,代码如下
_wfopen_s(&fp,L"out.txt",L"w+");
if (fp)
{
//写入unicode文件头
const char*utf16head = "\xFF\xFE";
fwrite( utf16head, 2, 1,fp);
//fwrite(line.c_str(), 2, line.size(),fp);
fwrite(L"dsad\n", 2, 5,fp);
fclose(fp);
}
发现”\n”写成了0x0d 0x0a 0x00 多了一个0x0d,造成文本解析错误,形成乱码。经过检查原来是文件打开方式的问题。w是以文本方式打开文件,wb是二进制方式打开文件。
以文本方式打开文件时,fwrite函数每碰到一个0x0A时,就在它的前面加入0x0D。这是因为为了与linux兼容, 本来换行原来就是0A(‘\n’), 微软把\n 改为了\r\n,即从0A改为0D 0A。
总结,当你以w方式打开时,向文件写入\n,其实是底层API帮你多写了一个\r。因此写入\r\n,比如fwrite(L”dsad\r\n”, 2, 6,fp)其实是写入了dsad\r\r\n。
而wb以二进制写入,没有添加内容的操作。因此把打开方式改为”wb+”就OK。代码如下
_wfopen_s(&fp,L"out.txt",L"wb+");
if (fp)
{
//写入unicode文件头
const char*utf16head = "\xFF\xFE";
fwrite( utf16head, 2, 1,fp);
//fwrite(line.c_str(), 2, line.size(),fp);
fwrite(L"dsad\n", 2, 5,fp);
fclose(fp);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/lampqiu/article/details/47778507