2011-06-22 25 views
1

我一直在我的应用程序中使用一个psql/django堆栈,而在Windows下却没有任何问题。当在Linux中使用特殊字符时Django Admin(使用postgresql)的UnicodeDecode错误

但是,最近我切换到一个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与en_US.UTF-8

  2. Apache是​​不是罪魁祸首(我不知道它是如何可能的),因为这发生在Django开发服务器。

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

我已经跑出去的想法,应该是什么和错误在于Django管理代码的中间很难调试,但大多是在str()unicode()功能崩溃。

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

任何想法将非常感激。

回答

0

我已经通过使用django的smart_str()每个可能有奇怪字符的字符串并对该新字符串应用替换过滤器来解决这个问题,以便每个字符都将被其ascii等效替换。它大部分工作,但它使一些代码看起来丑陋。啊,你好。

0

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

+0

其实就是这样。 LANG =的en_US.UTF-8 LC_CTYPE = “的en_US.UTF-8” LC_NUMERIC = “的en_US.UTF-8” LC_TIME = “的en_US.UTF-8” LC_COLLATE = “的en_US.UTF-8” LC_MONETARY = “的en_US.UTF-8” LC_MESSAGES = “的en_US.UTF-8” LC_PAPER = “的en_US.UTF-8” LC_NAME = “的en_US.UTF-8” LC_ADDRESS = “的en_US.UTF-8” LC_TELEPHONE = “'en_US.UTF-8” LC_MEASUREMENT =“en_US.UTF-8” LC_IDENTIFICATION =“en_US.UTF-8” LC_ALL = – Bruno

+0

这很有趣,因为'str('árbol')'只在我的语言环境不是设置为UTF-8。也许你可以检查应用程序用户(例如www-data或apache)是否有正确的区域设置? – sayap

+0

另外,您可以尝试比较'python -c“import sys; print sys.getdefaultencoding()”'的输出。 Windows安装可能已经改变了'ascii'默认值。 – sayap