我真的迷失在 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
我只看到'???'在浏览器上回显。谁能告诉我保存和显示上述数据的正确方法是什么。
谢谢
请您参考如下方法:
即使阅读了一些文档,您似乎仍对 unicode 的工作原理感到困惑。
- Unicode 不是一种编码。 Unicode 是没有编码。
-
utf-8不是 unicode。utf-8是一种编码。 - 您解码 utf-8 字节串以获得 unicode。您使用编码(例如 utf-8)编码 unicode 以获得编码字节串。
- 只有字节串可以保存到磁盘、数据库,或在网络上发送,或在打印机或屏幕上打印。 Unicode 仅存在于您的代码中。
最好的做法是尽早解码你得到的所有东西,在你所有的代码中使用它作为 unicode 解码,然后尽可能晚地编码它,当文本准备好离开你的程序时,以屏幕、数据库或网络。
现在解决你的问题:
如果您有来自浏览器的文本,例如来自表单的文本,那么它会被编码。它是一个字节串。它不是 unicode。
然后您必须对其进行解码以获得 unicode。使用浏览器用于编码的编码对其进行解码。正确的编码来自浏览器本身,在正确的 HTTP REQUEST header 中。
不要使用 'ignore'解码的时候。由于浏览器说明了它使用的是哪种编码,因此您不会收到任何错误。使用 'ignore'意味着如果有错误,您将隐藏错误。
也许您选择的 Web 框架已经做到了这一点。我知道 django、pylons、werkzeug、cherrypy 都这样做。在这种情况下,您已经获得了 unicode。
现在您有一个解码的 unicode 字符串,您可以使用您喜欢的任何编码对其进行编码以存储在数据库中。 utf-8是一个不错的选择,因为它可以对所有 unicode 代码点进行编码。
当您从数据库中检索数据时,使用与存储数据时相同的编码对其进行解码。然后使用您要在页面上使用的编码对其进行编码 - 在 html 元 header 中声明的编码 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> .如果编码与上一步中使用的相同,您可以跳过解码/重新编码,因为它已经用 utf-8 编码。
如果您看到 ???那么数据在上面的任何步骤中都会丢失。要确切知道,需要更多信息。
