2010-01-05 91 views
1

我真的迷失在所有使用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 

和所有我看到的是“???”在浏览器上回应。有人可以让我知道什么是正确的方式来保存和显示上述数据。

感谢

+0

第二个'encode'应该是'decode'吗? – miku 2010-01-05 12:59:12

+0

您是否安装了必要的字体? – Kugel 2010-01-05 13:00:08

+0

你是否声明你的输出是用UTF-8编码的? – Gumbo 2010-01-05 13:04:25

回答

8

即使已经看了一些文档,你似乎是如何统一的作品困惑。

  • Unicode不是编码。 Unicode是没有编码。
  • utf-8不是unicode。 utf-8是一种编码。
  • 解码 utf-8字节串来获取unicode。你编码 unicode使用编码,比如utf-8来获得一个编码字节串。
  • 只有字节串可以保存到磁盘,数据库,或在网络上发送,或打印在打印机或屏幕上。 Unicode只存在于你的代码中。

最好的做法是尽早解码所有你想要的东西,在你的所有代码中将它解码为unicode,然后尽可能晚地编码它,当文本准备离开你的时候程序,屏幕,数据库或网络。


现在对于你的问题:

如果您有从浏览器传来的文字,比如,从一种形式,然后进行编码。它是一个字节串。它不是unicode。

然后你必须解码才能得到unicode。使用浏览器用于编码的编码对其进行解码。正确的编码来自浏览器本身,位于正确的HTTP REQUEST标头中。

解码时不要使用'ignore'。由于浏览器说明了它使用的是哪种编码,因此不应该出现任何错误。使用'ignore'表示如果有错误,您将隐藏一个错误。

也许你的web框架的选择已经做到了。我知道django,pylons,werkzeug,cherrypy都可以做到这一点。在这种情况下,你已经得到了unicode。

现在你已经有了一个解码的Unicode字符串,你可以使用任何你喜欢存储在数据库上的编码来编码它。 utf-8是一个不错的选择,因为它可以编码所有的unicode码点。

当您从数据库中检索数据时,使用您用于存储数据的相同编码对其进行解码。然后使用您想要在页面上使用的编码进行编码 - 在html元首标头<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>中声明的编码。如果上一步使用的编码相同,则可以跳过解码/重新编码,因为它已经用utf-8编码。

如果您看到???,那么在上述任何步骤中数据都将丢失。准确地说,需要更多信息。

+2

+1可惜这是一个咖啡杯打印太长。 – 2010-01-05 14:06:22

+0

nokklo,谢谢你的回应。这就是我正在做的 - 我得到的是使用feedparser从以下URL获取RSS提要 - http://rixk.com。在经过上面的详细解释之后,我使用feedparser文档进行了检查,它说每个元素值都以Python Unicode字符串的形式返回(有一些例外 - http://www.feedparser.org/docs/introduction.html) 。现在因为数据已经是Unicode了,按照你上面的解释,我不应该真正编码它,而是一直使用unicode字符串,直到在提交数据库之前。是对的吗? – vivpuri 2010-01-05 15:03:37

+0

*现在因为数据已经是Unicode了,按照你上面的解释,我不应该真的在早期对它进行编码* - > Typo:你应该说“我不应该早**解码**” - 因为它已经被解码(unicode)。它正在被feedparser本身尽早解码!你应该在发送到数据库之前对它进行编码。 – nosklo 2010-01-05 15:10:58

0

通过this post了解如何在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 
0

问题是肯定(尤其是如果其他非ASCII字符显示工作正常),您的浏览器或操作系统不具备适当的字体显示韩文文本,或者浏览器使用的默认字体不支持韩文。尝试选择另一种字体,直到它工作。