真是一入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);
那么就完美解决了