Python,最好的Unicode支持方法是什么?

3
我有一个使用Python编写的应用程序,从网站获取多语言信息,并在一个小的GUI窗口(基于wxpython)中呈现它们。
目前我的源文件中没有使用任何特定的Unicode语句。
现在,当我在Eclipse中运行Python应用程序时,法语字符(如ë)会被正确显示,但是当我从py2exe打包的版本中运行它时,这些字符就会变得混乱。 我不太理解为什么,因为使用py2exe构建不会产生unicode或编码相关的错误。
然而,为了解决这个问题,我按照文章的建议,在输出到屏幕之前将字符串包装在unicode(my_string, "utf-8")调用中。这解决了问题。
问题:
  • 在显示之前将字符串包装在unicode()调用中是否是正确的方法?
  • 为什么在Eclipse中不进行Unicode转换也能正常工作,但在Windows打包的.exe版本中却不能?
我已经尝试过很多次理解Unicode,但似乎我不兼容Unicode :-|
3个回答

6
最好的方法是尽早确保字符串为Unicode。如果你用来爬取网站的库没有提供Unicode,那么它们就没有做到应该做的事情(在我看来)。然后,您需要使用与您正在爬取的网页使用的相同编码将其解码为Unicode。
您的方法基本上是相反的,尽可能晚地进行解码。迄今为止它已经起作用,基本上只是纯粹的运气,因为你还没有遇到任何非UTF-8的字符串。任何ISO-8859-1字符串都会破坏您的应用程序。

我使用urllib2.urlopen()进行获取,然后使用Beautiful Soup进行解析。根据BeautifulSoup的文档,它应该始终返回unicode。但是,如果我在任何一个Beautiful Soup返回的最终值上执行type(value),我得到的是<type 'str'>而不是预期的<type 'unicode'>(当我执行print value时,它不会在字符串前面添加u)。因此,我并不确定我是否真的在那里使用unicode。 - Rabarberski
1
尽管文档(http://www.crummy.com/software/BeautifulSoup/documentation.html#Beautiful Soup Gives You Unicode, Dammit)中所说,BeautifulSoup并非总是返回Unicode,有许多情况下都不是,详见https://dev59.com/qU7Sa4cB1Zd3GeqP7uYF。在我看来,对于爬虫来说,lxml更好用且更加一致。 - Björn Lindqvist
是的,我刚刚发现了一个相关的SO帖子:http://stackoverflow.com/questions/843227/how-to-render-contents-of-a-tag-in-unicode-in-beautifulsoup,它确实描述了同样的问题:`renderContents()`(我正在使用)返回一个字符串而不是Unicode。 - Rabarberski
我觉得以下这个演示非常好:http://farmdev.com/talks/unicode/ - Rabarberski

1
为什么在Eclipse中不需要进行Unicode转换就能正常工作,但是在Windows打包的.exe版本中却不能正常工作?
我猜你是在Eclipse中使用PyDev吧?
最近我也遇到了这个问题,PyDev将sys.getDefaultEncoding()更改为"utf-8"。这意味着读写文件(或其他任何东西)默认情况下都是UTF-8编码。但是一旦我从控制台启动它,它就会回到操作系统的默认编码(例如Windows的ascii)。
声明字符串的良好实践是在其前面加上“u”:
u"the string"

这样字符串就是UTF-8编码的。在Python 3+中,它已成为默认设置。


0

我可能错了,但我认为它在Eclipse中能够工作是因为默认情况下可以使用UTF-8,并且py2exe生成的Windows可执行文件是Latin-1编码。

通过使用unicode(a_string, "UTF-8"),您可以显式地创建一个Python Unicode对象,其编码为UTF-8。因此,在使用该对象时,解释器会采用此编码方式。

Unicode对象可以在许多方法/函数/类中透明地用作字符串,包括print。无论如何,请注意,有时必须使用string作为函数参数。

您是否在文件顶部放置了# -*- coding: utf-8 -*-,表示“该文件中的任何字符串都是UTF-8编码”?

这可能使您避免将字符串显式转换为Unicode对象。


据我理解# -*- coding: utf-8 -*-这一行,它仅用于支持你的代码以Unicode编写,并不涉及处理的数据。 - Rabarberski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接