• 彻底解决.net中编码问题的心得


    本文将解决.net(c#)系统中因编码转换而出现的乱码问题。
      

    最近的系统与字符集打交道,字符集的编码是一个非常头疼的事情,不小心就会造成乱码。深入学习编码知识,可以使我们在写程序时少走弯路。

    要实现的功能:将一大堆网页文件批量导入数据库,然后再从数据库中批量导出保存为网页文件,导出的文件还需要再导入数据库中,依次循环。

    由于最原始的网页文件来源很复杂,所以造成了编码不统一,有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"));

  • 相关阅读:
    Enumerable类
    富客户端
    Entity Framework
    使用C库函数写文件出错
    VC 打开目录 打开上次打开目录
    boost_1_45_0安装
    boost中bimap双向映射的初级学习
    VS2008安装失败
    最近使用文档, 最近保存文档, 最近运行记录
    IE升级为8.0后, VS2008出现Internet Explorer脚本错误对话框
  • 原文地址:https://www.cnblogs.com/hackpig/p/1668455.html
Copyright © 2020-2023  润新知