Python编码问题

时间:2010-01-05 12:57:17

标签: python encoding utf-8

我真的迷失在Python的所有编码/解码问题上。阅读了很多关于如何完美处理传入的文档,我仍然遇到几种语言的问题,比如韩语。无论如何,这就是我正在做的事情。

korean_text = korean_text.encode('utf-8', 'ignore')
korean_text = unicode(korean_text, 'utf-8')

我将上述数据保存到数据库,这很好。

稍后当我需要显示数据时,我从db获取内容,并执行以下操作:

korean_text = korean_text.encode( 'utf-8' )
print korean_text

我所看到的只是'???'在浏览器上回应。有人可以告诉我保存和显示上述数据的正确方法。

由于

3 个答案:

答案 0 :(得分:10)

即使阅读了一些文档,您似乎也对unicode的工作方式感到困惑。

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

好的做法是尽早解码你得到的所有东西,在你的所有代码中使用解码的unicode,然后在文本准备离开你的程序时尽可能晚地对其进行编码,屏幕,数据库或网络。


现在为您解决问题:

如果您有来自浏览器的文本,例如,来自表单,则会对其进行编码。它是一个字节串。它不是unicode。

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

解码时请勿使用'ignore'。由于浏览器说它正在使用哪种编码,因此不应该出现任何错误。使用'ignore'表示如果有错误,您将隐藏错误。

也许你选择的网络框架已经做到了。我知道django,pylons,werkzeug,cherrypy都这样做。在那种情况下,你已经获得了unicode。

现在您已经解码了unicode字符串,您可以使用您希望存储在数据库中的任何编码对其进行编码。 utf-8是一个不错的选择,因为它可以编码所有unicode代码点。

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

如果您看到???,那么上述任何步骤都会丢失数据。要准确了解,需要更多信息。

答案 1 :(得分: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

答案 2 :(得分:0)

问题是肯定的(特别是如果其他非ASCII字符似乎工作正常)您的浏览器或操作系统没有正确的字体来显示韩文文本,或者浏览器使用的默认字体不是支持韩语。尝试选择另一种字体直到它起作用。