Python:带有codecs.open的UnicodeEncodeError

时间:2014-03-24 18:31:13

标签: python encoding utf-8 org-mode

我正在尝试使用orgnode.py(from here)来解析组织文件。这些文件是英文/波斯文,使用file -i它们似乎是utf-8编码的。但是当我使用makelist函数(它本身使用带有utf-8的codec.open)时我收到了这个错误:

>>> Orgnode.makelist("toread.org")
[**  [[http://www.apa.org/helpcenter/sexual-orientation.aspx][Sexual orientation, homosexuality and bisexuality]]            :ToRead:



Added:[2013-11-06 Wed]
, **  [[http://stackoverflow.com/questions/11384516/how-to-make-all-org-files-under-a-folder-added-in-agenda-list-automatically][emacs - How to make all org-files under a folder added in agenda-list automatically? - Stack Overflow]] 

(setq org-agenda-text-search-extra-files '(agenda-archives "~/org/subdir/textfile1.txt" "~/org/subdir/textfile1.txt"))
Added:[2013-07-23 Tue] 
, Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 63-66: ordinal not in range(128)

该函数返回一个组织标题列表,但不是最后一项(用波斯语写),它显示错误。 有什么建议我该怎么处理这个错误?

1 个答案:

答案 0 :(得分:0)

正如回溯告诉您的那样,异常是由您在Python控制台本身(Orgnode.makelist("toread.org"))上输入的语句引发的,而不是在评估语句期间调用的其中一个函数中引发的。

当解释器自动转换语句的返回值以将其显示在控制台上时,这是典型的编码错误。显示的文本是将repr()内置函数应用于返回值的结果。

此处repr()结果的makelistunicode对象,解释器默认使用str编解码器尝试将其转换为"ascii"

罪魁祸首是Orgnode.__repr__方法(https://github.com/albins/orgnode/blob/master/Orgnode.py#L592)返回unicode对象(因为节点内容已自动使用codecs.open解码),尽管{{1}通常希望方法只返回带有安全(ASCII)字符的字符串。

以下是您可以对Orgnode进行的最小变更,作为解决问题的方法:

__repr__

如果您想要一个只返回ASCII字符的版本,可以使用-- a/Orgnode.py +++ b/Orgnode.py @@ -612,4 +612,4 @@ class Orgnode(object): # following will output the text used to construct the object n = n + "\n" + self.body - return n + return n.encode('utf-8') 作为编解码器,而不是'string-escape'

这只是一个快速而肮脏的修复。正确的解决方案是重写正确的'utf-8'方法,并添加此类缺少的__repr____str__方法。 (如果我找到时间,我甚至可以自己解决这个问题,因为我对使用Python代码操作我的组织模式文件非常感兴趣)