在Eclipse中能运行包含Unicode字符串的Python代码,但在命令行或Idle中遇到UnicodeEncodeError。
我遇到过很多次这样的情况:我在Eclipse(PyDev)里解码或编码一些Unicode字符串,运行得很好,结果也和我预期的一样。但当我从命令行启动同样的脚本时,就会出现编码错误。
这有什么简单的解释吗?Eclipse是不是对Unicode做了什么特别的处理或者以不同的方式操作它?
补充:
举个例子:
value = u'\u2019'.decode( 'utf-8', 'ignore' )
return value
这个在Eclipse(PyDev)里能正常工作,但如果我在Idle或者命令行中运行就不行了。
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 135: ordinal not in range(128)
2 个回答
我想补充一下为什么在PyDev上能正常工作:它有一个特别的sitecustomize,可以通过sys.setdefaultencoding来调整Python的编码,使用的是PyDev控制台的编码。
需要注意的是,bobince的回答是对的,如果你有一个unicode字符串,你需要用encode()方法把它转换成一个合适的字符串(如果你有一个字符串,想把它转换成unicode,就要用decode方法)。
value = u'\u2019'.decode( 'utf-8', 'ignore' )
字节串会被解码成Unicode字符串。
Unicode字符串会被编码成字节串。
所以如果你说 someunicodestring.decode
,它会试图把Unicode字符串转换成字节串,以便能够再解码回Unicode!这个转换是隐式的,也就是说它会自动选择默认的编码方式,而这个默认编码在不同的环境中可能会有所不同,通常是比较“安全”的 ascii
编码,但这会导致你提到的错误,因为ASCII编码无法表示字符U+2019。依赖默认编码几乎总是个坏主意。
所以尝试对Unicode字符串进行 decode
是没有意义的。我敢肯定你想说的是:
value = u'\u2019'.encode('utf-8')
(ignore
在编码为UTF-8时是多余的,因为没有任何字符是这种编码无法表示的。)