我有一些代码将希伯来文本文件的Unicode表示转换为希伯来语以供显示
例如:
f = open(sys.argv[1])
for line in f:
print eval('u"' + line +'"')
当我在PyDev(eclipse)中运行它时,这很有趣,但是当我从命令行运行它时,我得到了
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 9-10: ordinal not in range(256)
输入文件的示例行是:
\u05d9\u05d5\u05dd
有什么问题?我该如何解决这个问题?
答案 0 :(得分:4)
不要使用eval()
;而是使用unicode_escape
编解码器来解释该数据:
for line in f:
line = line.decode('unicode_escape')
unicode_escape
编码解释\uabcd
字符序列的方式与解析源代码中的unicode文字时的Python相同:
>>> '\u05d9\u05d5\u05dd'.decode('unicode_escape')
u'\u05d9\u05d5\u05dd'
您看到的例外是{em> not 但eval()
语句引起的;我怀疑它是由尝试打印结果而造成的。 Python将尝试自动编码unicode
值,并将检测当前终端使用的编码。
您的Eclipse输出窗口使用终端的不同编码;如果后者配置为支持Latin-1,那么你会看到确切的异常,因为Python试图将希伯来代码点编码为不支持这些代码的编码:
>>> u'\u05d9\u05d5\u05dd'.encode('latin1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-2: ordinal not in range(256)
解决方案是重新配置您的终端(UTF-8将是一个不错的选择),或者不使用无法编码为Latin-1的代码点打印unicode
值。
如果要将输出从Python重定向到文件,则Python无法自动确定输出编码。在这种情况下,您可以使用PYTHONIOENCODING
environment variable告诉Python用于标准I / O的编码:
PYTHONIOENCODING=utf-8 python yourscript.py > outputfile.txt
答案 1 :(得分:0)
谢谢,这解决了我的问题。
line.decode('unicode_escape')
做了这个伎俩。
Followup - 现在可以了,但如果我尝试将输出发送到文件:
python myScript.py > textfile.txt
文件本身有错误:
'ascii' codec can't encode characters in position 42-44: ordinal not in range(128)