一段非常简单的写文件代码,发现偶尔生成乱码文件。
string filePath = @"F:\Administrator\Desktop\111.txt";
string str = @"前";
using (StreamWriter sw = new StreamWriter(File.Open(filePath, FileMode.Create), System.Text.Encoding.GetEncoding("GB2312")))
{
sw.Write(str);
}
生成如下文件:
注:选择“以ANSI格式解码”则正常显示,说明是用GB2312写的,但生成的文件编码不知为何变成UTF-8
如果把str 改为 "你前"则生成正确ANSI文件
这是编辑器的bug,哦不能叫bug,因为GBK编码的“前”太巧了,巧到编辑器认为这是一个UTF-8编码的字符。
因为它(C7 B0)命中了110yyyyy(C0-DF)10zzzzzz(80-BF)字符范围,编辑器在不确定你文件编码的情况下猜出了utf8编码,于是解码出了一个特殊字符。
而“你前”的首字符“你”没有命中utf8字符集范围,最终编辑器使用了设置中的非unicode默认字符集gb2312进行解码得出正确字符。
实际上题主输出的文件字节都是正确的,为了避免此类问题最好还是输出带bom的编码。
老早以前那个记事本保存不了“联通”的问题类似……