Blog Email GitHub

03 Jul 2010
又遇乱码

身为一个Chinese Web Coder,最烦也最不可避免的就是乱码。在解决乱码之前,必须搞清楚unicode和编码方式的区别,python中执行环境的默认编码。

unicode的诞生就是要显示世界上不同国家、不同地区的文字。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。在我看来,unicode就是一个简单的映射表,key是二进制编码,value就是各个语言的不同字符。而如何高效保存和读取这些二进制编码,就是编码方式所要解决的方法,不同编码方式有着不同的保存读取方式。

在python命令行解释器中:

>>> s = "中国"
>>> s
'xd6xd0xb9xfa'

我的理解就是,”中”和”国”两个字的unicode码按照python默认的编码方式保存起来了。至于默认编码方式是多少,是sys.getdefaultencoding()或者sys.getfilesystemencoding()。至于这两个的区别:

  • sys.getdefaultencoding(). Return the name of the current default string encoding used by the Unicode implementation. New in version 2.0.
  • sys.getfilesystemencoding(). Return the name of the encoding used to convert Unicode filenames into system file names, or None if the system default encoding is used.

到底用的哪个,我到现在还没有搞清。按照解释,应该是sys.getdefaultencoding(),但是实际测试却是sys.getfilesystemencoding()。

但是在文件中,却有另外一番理论。在文件中,我们需要关心两个编码:文件自身保存的编码以及我们在开始设置的coding。

#! -*- coding: utf-8 -*-

With that declaration, all characters in the source file will be treated as having the encoding encoding, and it will be possible to directly write Unicode string literals in the selected encoding. The list of possible encodings can be found in the Python Library Reference, in the section on codecs.

文件中如果字符串中有汉字,其对应值是以文件保存编码方式编码,因此如果开始设置的coding跟文件保存编码不一样,用设置的coding去解码时,自然会报错。因此让两种编码保证一致,是很有必要的。

Resoucres & References

  1. Using the Python Interpreter
  2. python -> docs-pdf -> library.pdf