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对照即可。

image

posted on 2010-11-27 19:06  MainTao  阅读(1508)  评论(0编辑  收藏  举报