MacOSX下Python2.5版本的locale的编码问题

今天更新mercurial的时候遇到了一个问题。

执行hg,结果报错:LookupError: unknown encoding: x-mac-simp-chinese

想到这个问题我以前在用django的时候碰到过,原来以为是django的问题,现在才知道原来是普遍的python的问题。

去hg的源代码里面minirst.py里面看了一下,发现是直接调用mercurial的encoding函数的encoding这个变量。

找到encoding.py里面,

try:  
    encoding = os.environ.get("HGENCODING")  
    if not encoding:  
        encoding = locale.getpreferredencoding() or 'ascii'  
        encoding = _encodingfixers.get(encoding, lambda: encoding)()  
except locale.Error:  
    encoding = 'ascii'
原来是locale这个模块搞的鬼。。

去locale.py里面看了一下,发现以下代码:

if sys.platform in ('win32', 'darwin', 'mac'):  
    # On Win32, this will return the ANSI code page  
    # On the Mac, it should return the system encoding;  
    # it might return "ascii" instead  
    def getpreferredencoding(do_setlocale = True):  
        """Return the charset that the user is likely using."""  
        import _locale  
        return _locale._getdefaultlocale()[1]
尝试执行了一下,直接返回了’x-mac-simp-chinese’

为了了解正确的结果,python2.6 -c ‘import locale; print(locale.getpreferredencoding());’返回结果’UTF-8′.

而UTF-8正是我设置的LC_ALL和LANG的结果。

看来是这个_locale模块搞得鬼。不过_locale啊。看名字就是c写的。为了省力。直接把

if sys.platform in ('win32', 'darwin', 'mac'):
改成了

if sys.platform in ('win32'):
然后顺手搜索了一下locale.py中的_locale,把所有的都改了。

执行hg,一切正常。

顺带搜了一下这个问题python的buglist里面有没有,果然看到了。http://bugs.python.org/issue1276。不过略看了一下,发现python2.5.x被无情的忽略了。看来只能自己hack了。:)。

你可能感兴趣的:(python,locale)