Python编码问题
我在处理Python中的编码和解码问题时真的很迷茫。虽然我读了不少关于如何正确处理输入的文档,但在处理一些语言时,比如韩语,还是遇到了一些问题。不管怎样,下面是我正在做的事情。
korean_text = korean_text.encode('utf-8', 'ignore')
korean_text = unicode(korean_text, 'utf-8')
我把上面的数据保存到数据库里,这个过程是没问题的。
后来,当我需要显示这些数据时,我从数据库中取出内容,然后做了以下操作:
korean_text = korean_text.encode( 'utf-8' )
print korean_text
结果在浏览器上显示的全是'???'。有人能告诉我正确的保存和显示这些数据的方法吗?
谢谢!
3 个回答
这个问题很可能是因为你的浏览器或者操作系统没有合适的字体来显示韩文,或者说浏览器默认使用的字体不支持韩文。你可以试着换个字体,看看能不能解决这个问题。
请阅读这篇文章,了解如何在Python中处理Unicode。
基本上,你需要做的事情有:
.encode() text to a particular encoding (such as utf-8) before sending it to the database.
.decode() text back to unicode (from your encoding) when reading it from the database
即使你看了一些文档,似乎还是对unicode的工作原理感到困惑。
- Unicode并不是一种编码。Unicode是没有编码的状态。
utf-8
并不是unicode。utf-8
是一种编码方式。- 你需要解码utf-8字节串才能得到unicode。你用编码(比如utf-8)来编码unicode,这样就能得到一个编码后的字节串。
- 只有字节串可以保存到硬盘、数据库,或者通过网络发送,或者打印到打印机或屏幕上。Unicode只存在于你的代码里。
好的做法是尽早解码你收到的所有内容,尽量在代码中以unicode的形式处理,然后在文本准备好离开你的程序时(比如输出到屏幕、数据库或网络)再进行编码。
现在说说你的问题:
如果你有一段来自浏览器的文本,比如说来自一个表单,那么它是编码过的。这是一个字节串,而不是unicode。
你必须先解码它才能得到unicode。使用浏览器用来编码的编码方式来解码。正确的编码信息来自浏览器本身,在正确的HTTP请求头中。
解码时不要使用'ignore'
。因为浏览器已经告诉你它使用了什么编码,所以你不应该遇到任何错误。使用'ignore'
意味着如果有错误你会把它隐藏起来。
也许你选择的网络框架已经处理好了这个问题。我知道django、pylons、werkzeug和cherrypy都能做到这一点。在这种情况下,你已经得到了unicode。
现在你有了一个解码后的unicode字符串,你可以使用任何你喜欢的编码方式来存储到数据库中。utf-8
是个不错的选择,因为它可以编码所有的unicode字符。
当你从数据库中取出数据时,使用你存储时用的相同编码进行解码。然后再使用你想在页面上使用的编码进行编码——这个编码在html的meta头中声明,像这样:<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
。如果这个编码和之前使用的编码相同,你可以跳过解码和重新编码的步骤,因为它已经是utf-8编码了。
如果你看到???
,那么在上述任何步骤中数据都可能丢失。要准确了解情况,需要更多的信息。