在Linux中使用特殊字符时,Django Admin的UnicodeDecode错误(使用postgresql)

时间:2011-06-22 07:00:17

标签: django postgresql unicode utf-8

我在Windows下使用psql / django堆栈一段时间没有任何问题。

然而,最近我换了一个linux盒子,很多地方都开始分手了。作为一名西班牙语演讲者,我的应用程序使用了许多特殊字符,如“á”或“ñ”。当然,我决定我的数据库和default_encoding应该是UTF-8以避免任何有趣的问题。

尽管如此,即使应用程序显示具有特殊字符的对象没有问题,但管理员也开始遇到很多问题。每当获取显示名称具有特殊字符的元素时,我都会感到害怕:

UnicodeDecodeError at /ajax_select/ajax_lookup/images
'ascii' codec can't decode byte 0xc3 in position 35: ordinal not in range(128)

基本上,Django试图获得这些元素的unicode()并且失败了。我可能会遗漏一些东西,因为它在我的Windows框中没有这样的问题,所以,基本上:

  1. PostgreSQL数据库编码在两个地方都是UTF-8(字符类型和校对不完全相同,但我认为不应该有任何区别:English_United States.1252 vs. en_US.UTF-8

  2. Apache不是罪魁祸首(我也不知道它是怎么回事),因为这也发生在django开发服务器上。

  3. Django默认为UTF-8,这是正确的,因为正如我所说,我可以在应用程序的其他位置完美地看到特殊字符,它只是在管理员的几个特定场景中失败。

  4. 我已经没想到应该是什么,因为错误位于django管理代码中间,很难调试,但大多数情况下它会在str()unicode()中崩溃功能

    问题的核心是:在Windows str('árbol') ='árbol'中。在Linux str('árbol')崩溃。

    任何想法都会非常感激。

2 个答案:

答案 0 :(得分:0)

如果从命令行运行locale,输出结果是什么?我怀疑它没有设置为UTF-8。

答案 1 :(得分:0)

我通过使用django的smart_str()可能有一个奇怪的字符并对该新字符串应用替换过滤器以使每个字符都被其ascii等效替换,从而可怕地解决了它。它在很大程度上起作用,但它使一些代码看起来很可怕。啊,c'est la vie。