【问题标题】:help() with unicode __author__ string带有 unicode __author__ 字符串的 help()
【发布时间】:2011-06-16 14:21:20
【问题描述】:

在 Python 2.6 脚本的开头,我想按拼写写出我的名字,即“Joël”(在 e 上带有 trema)。所以我写了__author__ = u'Joël',我可以通过一个简单的print __author__来检索它。

内置help() 函数出现问题,因为我收到一条错误消息:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xeb' in position 2: ordinal not in range(128)

我无法升级到 Python 3.x,但我发现此功能非常有用(肯定会为那些将获得我的脚本的人提供)。我也没有忘记用 UTF-8 编码文件,并通过添加以下内容在脚本中指定它:

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

知道这是从哪里来的吗?

提前感谢您的回答。


编辑 再次查看“Dive Into Python”一书,我发现了如何在我的机器上进行正确的渲染,请参阅http://www.diveintopython.org/xml_processing/unicode.html

我的想法是,我对 Python 的默认编码是 ASCII,这确实阻止了 help() 做出正确的输出。我所做的是在{pythondir}\Lib\site-packages中添加一个名为sitecustomize.py的脚本,设置默认编码:

import sys
sys.setdefaultencoding('iso-8859-1')

现在,输入字符串写成u'Joël',我通过调用 help() 得到正确的输出。

问题是,我很确定这会在其他计算机上中断。知道我该如何处理吗?

【问题讨论】:

    标签: python character-encoding author pydoc


    【解决方案1】:

    Pydoc 明确希望将作者姓名转换为 ascii:

      File "/usr/local/Cellar/python/2.7.1/lib/python2.7/pydoc.py", line 1111, in docmodule
        result = result + self.section('AUTHOR', str(object.__author__))
    UnicodeEncodeError: 'ascii' codec can't encode character u'\xeb' in position 2: ordinal not in range(128)
    

    您不太可能解决这个问题。

    【讨论】:

    • 当然可以。只需将其替换为具有自定义 __str__() 方法的对象即可。
    • 我只是在尝试这个,但我不知道在这个__str__() methode 里面放什么。我的意思是,在这里进行一些编码转换,例如去除重音,似乎与从一开始就写我的名字没有重音一样,因为任何print 都会这么称呼它。或者,我应该看看如何能够根据调用函数更改输出......不确定这是否合法。
    • @Ignacio 无论如何它都需要一个字节串。而sys.getdefaultencoding 毫无帮助地说'ascii'
    • 好吧,据我所知,我看不到任何解决方案。我可以认为这是 help() 函数中的错误吗?
    • 我发现了如何解决这个问题(至少在我的机器上......),请参阅下面的答案。任何cmets都将被应用。
    【解决方案2】:

    您需要使用简单字符串而不是 Unicode 字符串。因此:

    __author__ = 'Joël'
    

    然后显示内置帮助方法:

    AUTHOR
        Joël
    

    编辑:如果这不起作用,那么您可以通过执行以下操作强制返回您姓名的 8 位字符串版本:

     __author__ = u'Joël'.encode('utf-8')
    

    【讨论】:

    • 我担心这不会是跨平台的,因为它取决于平台的默认编码。
    • 好主意,我之前没试过。唉,它并没有我想要的那么好:在我自己的空闲计算机上,配置为 UTF-8,我得到Joël。奇怪的。如果我回到显式的 unicode 字符串,除了 help() 之外没有任何问题。
    猜你喜欢
    • 2017-08-02
    • 2016-09-30
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 2012-06-01
    • 1970-01-01
    相关资源
    最近更新 更多