目录
-
问题:
上一篇已经了解到如何在 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,传入正确的编码格式:
测试成功!
或者可以这样:
修改原程序,测试命令行下的效果:
显示正常。