BOM(Byte Order Mark)是Unicode编码的文件前面的Preamble。通过这个Preamble可以辨别是那种编码方式。
在使用.NET类库读写文本文件需要注意一条适应于大多情况的准则:
File.ReadAllText和File.WriteAllText都调用有Encoding参数的重载。
先来说一下我的目的,即用File.ReadAllText的时候尽可能不读出乱码。这要从ReadAllText和WriteAllText两方面去限制。
先说ReadAllText
File.ReadAllText使用Encoding.Default可以正确解析出Windows记事本可以保持的全部4种纯文本格式:ANSI, Unicode, Unicode Big Endian和UTF-8。
若File.ReadAllText使用不带Encoding的重载,无法正确解析出ANSI编码的纯文本文件来。
再说WriteAllText
File.WriteAllText不使用Encoding参数会将不带BOM的UTF-8编码写入文件。用同样不带Encoding参数的ReadAllText可以正确读出,但如上文建议的用带Encoding.Default参数的ReadAllText反而会读出乱码。因此,建议调用WriteAllText的时候带上Encoding.UTF8参数(因为在Unicode中UTF8是相对占用空间少的)。
总结一下:
如果能控制读和写,最好能统一编码方式,并显式写在代码中。
如果只能控制读,ReadAllText使用Encoding.Default参数。
如果智能控制写,WriteAllText使用Encoding.UTF8参数。
辨别编码方式
如果要辨别文件的编码方式,就读出前面几个字节,然后跟不同编码方式的preamble对照即可。