django国家编码没有给出正确的名称

时间:2015-06-04 07:44:58

标签: python django python-unicode django-countries

我在国家/地区列表中使用django_countries模块,问题是有几个国家/地区有'Åland Islands''Saint Barthélemy'等特殊字符。

我正在调用此方法来获取国家/地区名称:

country_label = fields.Country(form.cleaned_data.get('country')[0:2]).name

我知道country_label是django utils的延迟翻译代理对象,但它没有给出正确的名称,而是给出了'Ã…land Islands'。对此有何建议?

3 个答案:

答案 0 :(得分:4)

Django使用代码点存储unicode字符串,并将字符串标识为unicode以供进一步处理。 UTF-8使用四个8位字节编码,因此Django使用的unicode字符串需要在某些时候从代码点表示法解码或解释为其UTF-8表示法。 在奥兰群岛的情况下,似乎正在发生的是它采用UTF-8字节编码并将其解释为转换字符串的代码点。

字符串django_countries返回很可能是u'\xc5land Islands',其中\xc5是Å的UTF代码点符号。在UTF-8中,字节符号\xc5变为\xc3\x85,其中每个数字\xc3\x85是一个8位字节。看到: http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=xc5&mode=hex

或者您可以使用country_label = fields.Country(form.cleaned_data.get('country')[0:2])。name.encode('utf-8')从u'\xc5land Islands'转到{ {1}}

如果你接下来每个字节并将它们用作代码点,你会看到它会给你这些字符:'\xc3\x85land Islands' 请参阅:http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=xc3&mode=hex 并且:http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=x85&mode=hex

请参阅带有这些字符的html表示法的代码段。

Ã…

所以我猜你在你的应用程序中有2种不同的编码。从<div id="test">&#xC3;&#x85;&#xC5;</div>u'\xc5land Islands'的一种方法是在utf-8环境中编码为UTF-8,将u'\xc3\x85land Islands'转换为u'\xc5',然后解码为{{来自'\xc3\x85'的1}}会给unicode。但是因为它不在你提供的代码中,我猜它发生在你设置iso-8859的那一刻和输出没有正确显示的那一刻之间。自动因为编码设置,或通过某处的显式指定。

第一次编辑

要为您的应用设置编码,请在您的py文件顶部添加u'\xc3\x85land Islands',并在模板中添加country_label。 要从django.utils.functional。代理对象获取unicode字符串,您可以调用# -*- coding: utf-8 -*-。像这样:

<meta charset="UTF-8">

第二次编辑

找出问题所在的另一种方法是使用unicode()https://docs.djangoproject.com/en/1.8/ref/utils/#module-django.utils.encoding)这样:

country_label = unicode(fields.Country(form.cleaned_data.get('country')[0:2]).name)

但是既然你已经尝试了许多转换而没有成功,那么问题可能就更复杂了。您可以分享force_bytesfrom django.utils.encoding import force_bytes country_label = fields.Country(form.cleaned_data.get('country')[0:2]).name forced_country_label = force_bytes(country_label, encoding='utf-8', strings_only=False, errors='strict') 和django app语言设置的版本吗? 您还可以直接在django_countries包中找到它(应该在您的python目录中),找到文件data.py并打开它以查看它的外观。也许数据本身已损坏。

答案 1 :(得分:0)

尝试:

from __future__ import unicode_literals #Place as first import.

AND / OR

country_label = fields.Country(form.cleaned_data.get('country')[0:2]).name.encode('latin1').decode('utf8')

答案 2 :(得分:0)

本周我遇到了类似的编码错误。我认为问题是因为机器编码与Python上的编码不同。尝试将其添加到.bashrc.zshrc

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8

然后,打开一个新终端并再次运行Django应用程序。