最近的系统与字符集打交道,字符集的编码是一个非常头疼的事情,不小心就会造成乱码。深入学习编码知识,可以使我们在写程序时少走弯路。
要实现的功能:将一大堆网页文件批量导入数据库,然后再从数据库中批量导出保存为网页文件,导出的文件还需要再导入数据库中,依次循环。
由于最原始的网页文件来源很复杂,所以造成了编码不统一,有utf8、gb2312、gbk等。一般情况下,.net读取文本文件时,自己会识别出来编码,不需要我们操心,但是,经过测试,从数据库中读取的内容保存为文件后(写入时统一设置为utf-8),程序就不能正常识别文件的编码了。
.net中的System.IO.File.ReadAllText(filePath),默认采用utf-8为编码来读取文件,也可以传入编码System.Text.Encoding.Default来解决问题。Default是Encoding类的一个属性,表示操作系统的当前 ANSI 代码页的编码。不同区域的操作系统,该属性值是也是不同的,比如:亚洲地区语言的编码的值为:System.Text.DBCSCodePageEncoding。
.net通过文件的BOM信息,能判断出来文件是什么格式:
Unicode {0xFF, 0xFE};
BE-Unicode {0xFE, 0xFF};
UTF8 = {0xEF, 0xBB, 0xBF};
由上可知,我将数据库里的内容保存为文件时,可能没有将BOM信息写入文件头,因此.net没有正确获取到文件的编码类型。
写入文件时,将BOM信息也添加到文件的代码:
以下为引用的内容: StreamWriter myText; myText = new StreamWriter("文件路径", false, new UTF8Encoding(true)); |
这样保存的文件,.net就可以识别出来它的编码了,而不至于再造成乱码的问题了。
小结:通过将文件转换成byte[],然后分析文件的BOM信息,即可得到文件的编码类型,然后进行相应的操作,避免造成乱码!
当文件有BOM信息时,我们通过File.ReadAllText("c:\cn_web_com.html",System.Text.Encoding.Default)就可以让.net自动去识别文件的编码类型,从而获取正确的文件内容。
当文件没有BOM信息时,我们在写入文件时,最好能添加它的BOM信息。否则,我们只能手动针对不能的编码来解析不同的文件,比如cn_web_com.html为utf8编码,我们读取它时,语句为:File.ReadAllText("c:\cn_web_com.html",System.Text.Encoding.GetEncoding("utf-8"));