我搜索并发现了一些相关的问题,但他们处理Unicode的方式不同,所以我不能将解决方案应用到我的问题中。
我不会粘贴我的整个代码,但我确定这个孤立的示例代码会复制错误: (我也在使用wx进行GUI,所以这就像在一个类中一样)
#coding: utf-8
...
something = u'ЧЕТЫРЕ'
//show the Russian text in a Label on the GUI
self.ExampleLabel.SetValue(str(self.something))
在Eclipse上,一切都运行良好,并显示俄语字符。但是,当我尝试直接在文件中打开Python时,我在CL上得到了这个错误:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-11:
ordinal not in range(128)
我认为这与CL无法输出Unicode字符和Eclipse做幕后魔术有关。有关如何制作它以使其独立工作的任何帮助吗?
答案 0 :(得分:5)
当你在没有指定编码的情况下调用str()
时,会使用默认编码,这取决于程序运行的环境。在Eclipse中,这与命令行不同。
不要依赖默认编码,而是明确指定:
self.ExampleLabel.SetValue(self.something.encode('utf-8'))
您可能需要研究Python Unicode HOWTO以了解编码和str()
对unicode对象的作用。 wxPython项目也有page on Unicode usage。
答案 1 :(得分:1)
请尝试self.something.encode('utf-8')
。
答案 2 :(得分:1)
如果您使用repr而不是str,它应该为您处理转换,并且还涵盖了对象并不总是字符串类型的情况,但您可能会发现它为您提供了额外的引号集,甚至是unicode u在你的背景下。 repr比str-str假设ascii编码更安全,但是repr会以你在代码中看到它们的方式显示你的代码点,因为使用eval包装应该将它转换回原来的状态 - repr必须以python代码所在的形式,即ascii安全,因为大多数python代码都是用ascii编写的。