0

我有一些代码可以将希伯来文本文件的 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

问题是什么?我该如何解决这个问题?

4

2 回答 2

4

不要使用eval();而是使用unicode_escape编解码器来解释该数据:

for line in f:
    line = line.decode('unicode_escape')

unicode_escape编码解释\uabcd字符序列的方式与 Python 在源代码中解析 unicode 文字时的方式相同:

>>> '\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 将是一个不错的选择),或者不打印unicode具有无法编码为 Latin-1 的代码点的值。

如果要将 Python 的输出重定向到文件,则 Python 无法自动确定输出编码。在这种情况下,您可以使用PYTHONIOENCODING环境变量来告诉 Python 标准 I/O 使用什么编码:

PYTHONIOENCODING=utf-8 python yourscript.py > outputfile.txt
于 2013-02-02T14:55:08.730 回答
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)
于 2013-02-02T19:28:20.093 回答