windows系统下使用 python -m json.tool 中文解析错误

目录

 

问题:

原因:

解决办法:


  • 问题:

    上一篇已经了解到如何在 Linux 系统中使python -m json.tool 正常显示中文。
    然后想测试下在windows环境下的使用情况:



    发现初始情况和上一篇linux中遇到的情况一样,于是按着同样的方法修改程序:




    再次测试:



    发现中文显示还是有问题,但已经明显转为中文了,只是显示的不对。为了一探究竟,所以我将这个 tool.py 文件拷贝到了pycharm编辑器中,进行断点调试。
  • 原因:

    在pycharm中设置好参数:



    上图的参数是我在命令行中测试使用的json文件地址。
    测试下效果:



    断点看下:



    断点过程中就看到了问题所在,infile使用的编码格式是 cp936,而outfile使用的编码格式是 UTF-8
    UTF-8显然是对的,但是这个 cp936 编码又是从哪里来的呢?
    带着疑问可以继续断点,infile是从options中获取的,options是 parser.parse_args() 方法返回的,那么只需要看看这个方法为什么会返回一个 cp936编码格式的文件对象即可。



    前面与编码无关的代码略过,这个type_func 方法的调用,返回了 encoding=cp936,所以继续 step in:



    这里可以看到是调用的内置的 open 方法,并且编码格式为空,并没有设置,那么这个编码格式是哪里来的呢?到了这里,可以继续F7,step in:



    进入了一个新的方法,从代码中可以看到,如果是windows系统,会执行下面的 if 代码块,其中的方法运行结果为:


    找到了,就是在调用open方法的时候,先调用了获取编码的方法,在windows环境下,获取出来的结果是 cp936。
  • 解决办法:

    现在知道了原因,那么解决办法有多种:

    1.修改系统的编码格式:


    936就是简体中文的编码,我没有去尝试修改这个编码。

    2.修改程序:
    根据上述的探索,发现文件是以 cp936 的编码格式读取出来的,但是文件的实际编码其实是 utf-8,所以可以在读出文件以后,将数据按照读取时使用的编码格式重新编码为unicode格式,再次调用 json.loads,传入正确的编码格式:



    测试成功!



    或者可以这样:



    修改原程序,测试命令行下的效果:



    显示正常。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值