Django驱动的站点中的Unicode

时间:2012-07-19 03:21:10

标签: python django unicode

这是几个星期以来我第二次陷入编码问题。我已经在这个问题上花了这么长时间,我很感激能得到的任何帮助。

这就是我想要做的事情:

1)从我计算机上的MySQL表中选择一些行。

2)将这些行写入文本文件。

3)将文本文件传输到我的Amazon EC2 Ubuntu实例。

4)将文本文件的内容写入MySQL数据库。

5)让Django从#4中的数据库中选择一些行。

6)在网站上显示。

在步骤#1中,我只有一个普通的SELECT语句。 在步骤#2中,我这样做了:

file = codecs.open('commentsfordjango.txt', encoding = 'utf-8', mode='w')
file.write(fullcomment.decode('utf8') + '\n\n\n\n\n\n')

在第2步之后,我在Windows中打开了.txt文件,我可以看到所有实际的中文字符而没有任何错误。

在第3步中,我刚刚使用WinSCP传输了文件。 在第4步中,我这样做了:

file = open('/usr/local/src/blog/commentsfordjango.txt', 'r')
cursor.execute("INSERT INTO polls_poll (commenttext, pos, neu, neg) VALUES (%s, 0, 0, 0)", line)

在第5步中,我在views.py中执行了此操作:我只返回了与模型对应的对象。我的模型有一个 unicode 函数,但我没有调用它,因为我默认读取它,当你调用对象时它已被调用。

在步骤#6中,我的HTML文件在文件顶部有以下行:

<meta charset="utf-8" />

另外,我将Apache编码默认更改为Unicode。我还确保步骤#4中的SQL数据库是Unicode格式。

然而,在这之后,我的网站仍然显示了一堆不可读的,奇怪的字符:人在åšï¼Œå¤©åœ¨çœ<ã€。

任何帮助都将非常感激 - 我已经尝试了很多涉及.decode()和.encode('utf-8')的变体,并且已经花了很长时间才解决这个问题!

2 个答案:

答案 0 :(得分:1)

在步骤2中,您应该将文本编码为UTF-8。

with open("commentsfordjango.txt", "wb") as f:
    f.write(fullcomment.encode('utf8'))

在步骤3中,您可以将从文件中读取的数据解码回unicode。

with open("commentsfordjango.txt", "rb") as f:
    for line in f.read().decode("utf-8").splitlines():
        cursor.execute("INSERT INTO polls_poll (commenttext, pos, neu, neg) VALUES (%s, 0, 0, 0)", line)

更好的解决方案是使用Django的内置loaddata/dumpdata工具。

答案 1 :(得分:0)

问题的很大一部分可能是您手动将项目插入数据库而不是使用Django的数据库ORM。 ORM负责所有编码/解码,确保从数据库中获得良好的unicode,无论数据库本身内部使用何种编码。

所以:你确定要将正确的编码插入数据库吗?您可能应该使用ORM进行快速测试。确保使用codecs.open()(您似乎正在做的)以正确的方式阅读文件,并将其填入django模型并保存。