[python]python字符编码相关的一个问题分析

几天前看过一个问题,给了下面的代码:

#!d:/python26/python
# -*- coding: utf-8 -*-

import logging

try:
    raise Exception() # 测试中文
except:
    logging.exception("just a test.")

在python2.x下有问题,报错时显示相关代码时中文为乱码。

正常的结果应该如下:

ERROR:root:just a test.
Traceback (most recent call last):
  File "p-test-gbk.py", line 11, in <module>
    raise Exception() # 测试中文
Exception

先在sublime text 2下检查一下,其中Python.sublime-build设置如下:

{
    "cmd": ["d:/python26/python.exe", "-u", "$file"],
//  "cmd": ["f:/python3/python.exe", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
    "shell": "true",
    "encoding": "gbk"   
}

这个配置与"[python]打印-Hello world"中使用的是一样的。

结果自然是在sublime text 2中出错了,显示:

[Decode error - output not gbk]

这很正常,输出的内容中有中文,但是编码为UTF-8,而输出要求为gbk,因为中文在注释中,无法如"[python]打印-Hello world"一文中所述的进行重新编码,所以sublime text 2的输出结果显示区就报错了。

解决方法很简单,修改Python.sublime-build,使用缺省输出编码:

{
    "cmd": ["d:/python26/python.exe", "-u", "$file"],
//  "cmd": ["f:/python3/python.exe", "-u", "$file"],
    "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)",
    "selector": "source.python",
    "shell": "true"
    //"encoding": "gbk" 
}

这样,这样就可以得到正常结果了。但这样,又会出现一个新问题,sublime text2中的结果是正确了,但源码在cmd命令行下运行又出现乱码了。

ERROR:root:just a test.
Traceback (most recent call last):
  File "p-test.py", line 7, in <module>
    raise Exception() # 娴嬭瘯涓枃
Exception

因为命令行下需要以gbk字符串,但python的异常处理中抛出的是utf-8编码的字符串。

这个问题可以说是python2中一个字符处理中的小bug,目前的解决办法是,python.sublime-build还是使用原来的配置,即输出gbk,所有源码不再以utf-8方式保存,而是gbk,这样就正常了。

不过sublime text 2编辑器对中文编码代码的支持还不好,有一个插件GBK Encoding Support专门用来处理这个问题,这个插件可以让文件保存时以gbk编码方式保存,打开时转成utf-8让sumblime text 2能正常处理。使用前最好搞清其运行方式。

当然,在python2中遇到的各种字符编码问题其实要彻底解决的办法就是升级到python3,不然,一不留神,很容易会遇到这样那样的小问题。

标签: python, 编码, sublime text 2, 乱码, 字符, python2, python3

仅有一条评论

  1. With thanks, Numerous tips.

添加新评论