在Python中,希伯来语在Eclipse中打印正常但在Shell中不行
我有一些代码,可以把希伯来文文本文件的Unicode表示转换成可以显示的希伯来文。
比如说:
f = open(sys.argv[1])
for line in f:
print eval('u"' + line +'"')
在PyDev(一个开发环境)里运行的时候,这个代码运行得很好,但当我从命令行运行时,却出现了
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 9-10: ordinal not in range(256)
输入文件中的一行示例是:
\u05d9\u05d5\u05dd
这是什么问题呢?我该怎么解决这个问题?
2 个回答
0
谢谢你,这个解决了我的问题。
line.decode('unicode_escape')
这个方法有效。
后续 - 现在这个可以用了,但如果我尝试把输出保存到一个文件里:
python myScript.py > textfile.txt
文件本身出现了错误:
'ascii' codec can't encode characters in position 42-44: ordinal not in range(128)
4
不要使用 eval()
;建议使用 unicode_escape
编码来解析这些数据:
for line in f:
line = line.decode('unicode_escape')
unicode_escape
编码会像 Python 在源代码中解析 Unicode 字面量时那样处理 \uabcd
这样的字符序列:
>>> '\u05d9\u05d5\u05dd'.decode('unicode_escape')
u'\u05d9\u05d5\u05dd'
你看到的异常并不是因为 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
环境变量 来告诉 Python 使用什么编码进行标准输入输出:
PYTHONIOENCODING=utf-8 python yourscript.py > outputfile.txt