2012-03-06 72 views
2

我有一个Django应用程序处理从Google导入的数据(通过gdata api)的问题。基本上,从Google导入的每个文本都会在我的页面上显示编码问题(例如:'CearáState'显示为'CearáState')。Django和MySql - 编码困难

MySQL数据库上的enconding设置为UFT-8和所有的文本都在我的查询正确显示,但事情开始变得有点怪异我做了一些尝试用Django的后壳:

我已经改变了这些文本由手之一,现在它显示在页面上没有编码的问题,而是由外壳呼应的文本仍然类似于编码问题的:

>>> v1 
<Video: São Paulo is awesome!> 
>>> v1.title 
u'S\xe3o Paulo is awesome!' 
>>> v2 
<Video: Ceará State> 
>>> v2.title 
u'Cear\xc3\xa1 State' 

如果我尝试打印正文:

print v1.title 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe3' in position 1: ordinal not in range(128) 

有什么想法发生了什么,我该如何解决它?谢谢。

编辑:

我写了一个很愚蠢的函数来处理我的问题,而有没有更好的解决办法:

def normalize(s): 
    return s.encode('utf-8').replace('á', 'á').replace('ó', 'ó').replace('ç', 'ç').replace('ã', 'ã').replace('Ã', 'í') 

EDIT 2: 

问题是由阿帕奇造成这是不是设置为使用UFT- 8。

+1

我觉得你的shell不支持这些编码,你有没有显示在模板这个数据? – Ahsan 2012-03-06 18:01:40

+0

Ahsan - 是的。我用手修改了重音的标题正确显示,而其他人用替换重音符的奇怪字符搞乱了。 – Raphael 2012-03-06 18:05:48

+0

@Ahsan - 请注意,v1在shell上的unicode表示是正确的: <视频:圣保罗真棒!>和v2的unicode表示形式变混淆了:<视频:Ceará状态> – Raphael 2012-03-06 18:35:33

回答

1

如果我理解你正确你得到错误,而打印在外壳标题所以尽量以此为

print v1.title.encode('utf-8') 
+0

我的错误不是只在壳中。该文本也在我的模板上显示错误。我试过这个功能,但它更让我的字符串搞砸了。 – Raphael 2012-03-06 18:39:05

+0

我正在处理一个非常愚蠢的函数来处理我的问题:def normalize(s): return s.encode('utf-8')。replace('Ã''''')。replace('³ '''')。replace('ç','ç')。replace('Ã'','ã')。replace('Ã','í') – Raphael 2012-03-06 19:07:29

+0

如果google api返回的不是这些角色,这不适合那些人。如果你忽略这些非ascii字符,比如'',这将是'A'等,可能会有解决方案。 – Ahsan 2012-03-06 19:35:46