【问题标题】:Unicode in a Django-powered site由 Django 提供支持的站点中的 Unicode
【发布时间】:2012-07-19 03:21:10
【问题描述】:

这是我几周内第二次被编码问题困住了。我已经在这个问题上花费了很长时间,如果能得到任何帮助,我将不胜感激。

这就是我想做的:

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')

在第二步之后,我在 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') 的变体,并且已经在这个问题上花费了太长时间!

【问题讨论】:

  • 您实际上想在写入时使用 .encode()。为什么在一个位置使用 codecs.open() 而不是在另一个位置?
  • “另外,我将我的 apache 编码默认更改为 unicode”——这很荒谬,unicode 不是编码。
  • 当您打开文件查看时,您确定用正确的字符集保存了吗?
  • 我意识到这是一个 Django 问题。如果我在第 5 步不使用 Django,而是创建一个新的 python 文件来选择行,然后将它们连同 和 一起写入 .html 文件标签,它工作得很好。 Django 为我检索对象的方式有什么问题吗?

标签: python django unicode


【解决方案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 设施。

【讨论】:

  • 我意识到这是一个 Django 问题。如果我在第 5 步不使用 Django,而是创建一个新的 python 文件来选择行,然后将它们连同 和 一起写入 .html 文件标签,它工作得很好。 Django 为我检索对象的方式有什么问题吗?
【解决方案2】:

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

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

【讨论】:

  • 我意识到这是一个 Django 问题。如果我在第 5 步不使用 Django,而是创建一个新的 python 文件来选择行,然后将它们连同 和 一起写入 .html 文件标签,它工作得很好。 Django 为我检索对象的方式有什么问题吗?
  • Django 对 you 所做的事情有疑问 :-) 您使用 Django 从数据库中检索数据,但您自己手动将数据放入。 Django 为您的数据库进行正确的 unicode 编码/解码。但是您可能在手动插入时输入了错误的内容。当您再次手动将其取出时,它会起作用(因为您以与放入相同的方式进行操作)。如果你用django插入数据再取出来也可以。
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2015-08-19
相关资源
最近更新 更多