这是正在发生的事情:
- sampleString 是一个字节串(cp1255 编码)
-
sampleString.decode("cp1255") 将字节串解码(decode==bytes -> unicode string)为 unicode 串
-
print sampleString.decode("cp1255") 尝试将 unicode 字符串打印到标准输出。 Print 必须encode unicode 字符串来做到这一点(encode==unicode string -> bytes)。您看到的错误意味着 python print 语句无法将给定的 unicode 字符串写入控制台的编码。 sys.stdout.encoding 是终端的编码。
所以问题是您的控制台不支持这些字符。您应该能够调整控制台以使用另一种编码。具体操作方法取决于您的操作系统和终端程序。
另一种方法是手动指定要使用的编码:
print sampleString.decode("cp1255").encode("utf-8")
另见:
一个您可以试验的简单测试程序:
import sys
print sys.stdout.encoding
samplestring = '\xe0\xe1\xe2\xe3\xe4'
print samplestring.decode("cp1255").encode(sys.argv[1])
在我的 utf-8 终端上:
$ python2.6 test.py utf-8
UTF-8
אבגדה
$ python2.6 test.py latin1
UTF-8
Traceback (most recent call last):
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)
$ python2.6 test.py ascii
UTF-8
Traceback (most recent call last):
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
$ python2.6 test.py cp424
UTF-8
ABCDE
$ python2.6 test.py iso8859_8
UTF-8
�����
latin-1 和 ascii 的错误消息意味着字符串中的 unicode 字符不能用这些编码表示。
注意最后两个。我将 unicode 字符串编码为 cp424 和 iso8859_8 编码(http://docs.python.org/library/codecs.html#standard-encodings 上列出的两个支持希伯来字符的编码)。使用这些编码我也不例外,因为希伯来语 unicode 字符在编码中有一个表示。
但是当我的 utf-8 终端接收到与 utf-8 不同编码的字节时,它会变得非常困惑。
第一种情况(cp424),我的UTF-8终端显示ABCDE,表示A的utf-8表示对应ה的cp424表示,即字节值65表示A在utf-8中,ה在cp424.
encode 方法有一个可选的字符串参数,您可以使用它来指定当编码不能表示字符时应该发生什么 (documentation)。支持的策略是严格(默认)、忽略、替换、xmlcharref 和反斜杠替换。你甚至可以add your own custom strategies。
另一个测试程序(我在字符串周围加上引号以更好地显示忽略的行为):
import sys
samplestring = '\xe0\xe1\xe2\xe3\xe4'
print "'{0}'".format(samplestring.decode("cp1255").encode(sys.argv[1],
sys.argv[2]))
结果:
$ python2.6 test.py latin1 strict
Traceback (most recent call last):
File "test.py", line 4, in <module>
sys.argv[2]))
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)
[/tmp]
$ python2.6 test.py latin1 ignore
''
[/tmp]
$ python2.6 test.py latin1 replace
'?????'
[/tmp]
$ python2.6 test.py latin1 xmlcharrefreplace
'אבגדה'
[/tmp]
$ python2.6 test.py latin1 backslashreplace
'\u05d0\u05d1\u05d2\u05d3\u05d4'