在Eclipse中能运行包含Unicode字符串的Python代码,但在命令行或Idle中遇到UnicodeEncodeError。

4 投票
2 回答
2025 浏览
提问于 2025-04-16 23:48

我遇到过很多次这样的情况:我在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 个回答

9

我想补充一下为什么在PyDev上能正常工作:它有一个特别的sitecustomize,可以通过sys.setdefaultencoding来调整Python的编码,使用的是PyDev控制台的编码。

需要注意的是,bobince的回答是对的,如果你有一个unicode字符串,你需要用encode()方法把它转换成一个合适的字符串(如果你有一个字符串,想把它转换成unicode,就要用decode方法)。

8
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时是多余的,因为没有任何字符是这种编码无法表示的。)

撰写回答