C#.Net Core 读取配置文件中文出现乱码问题深入分析

浏览:529 发布时间:2019/10/16 20:49:26 返回


    前面文章已经说明出现问题,本文主要深入分析一下原因,不要只是网上搜答案,把配置文件改成UTF-8就算完成任务了。

    1,先看问题重现

    建一个控制台应用程序,添加了个json文件如下

//jsconfig1.json
{
  "exclude": [
    "**/bin",
    "**/bower_components",
    "**/jspm_packages",
    "**/node_modules",
    "**/obj",
    "**/platforms"
  ],
  "test": {
    "t1": "aa",
    "t2": "中aa"
  }
}

    编写重现代码,需要引入

image.png

            //这里需要引入三个包
            IConfiguration c;
            var builder = new ConfigurationBuilder()
                .SetBasePath(AppDomain.CurrentDomain.BaseDirectory)
                .AddJsonFile("jsconfig1.json");
            c = builder.Build();

            var str = c["test:t2"]; //重现乱码

    2.什么原因?因为vs中配置文件,就是这个.json是以ANSI编码方式存储的,ANSI编码各国是不兼容的,不同国家操作系统用的编码方式不一样,中国以GBK方式,日本以JS编码等等。

    但是,程序里面读取内容却是以Encoding.Default方式来解码,而vs2017中Default就是UTF-8所以所程读出为乱码,所以按以前的方式把json文件保存是UTF-8就可以了,可能好多解决问题就这样试,改成GBK,改成UTF8能行就可以了,但是深入原因没去研究,这里我们就把这里研究清楚。

    3.另一种方式,如果我们不改文件编码方式能不能搞定,能。

image.png

我们注册一下,就可以用GB2312,GBK都可以解码出来就是正常的内容了,因为编码解码一样就正常了,前面一篇文章有特别聊聊编码的,传送

    如果我们清楚计算机内部存储,其实都是byte,都是0101,都是数字,我们甚至可以自己构造出字符来,比如

image.png

这里214,208,97,97 就是以GBK方式编码的字节,如果我们按着这种方式解码出来就是 中aa。

    到这里我们至少对编码读取解码有了一定了解,当以后出来乱码的时候一定是编码解码不一致导致的。其实这里也不是深入了解,再深入应该是编码的规则,字节等东西,不过到这一步已经比较清楚了。

    最后扯点其他的,前面那篇文章,我有提到宽字节,unicode,vs里面直接量字符串确实是用的unicode,(utf16)方式编码的,aa在内存里就是97,0,97,0,而不是上面我说的97,97,这个是有差别的。

    前面文章传送

广告

昵称*:
邮箱:
评论*: