Кодирование стран django не дает правильного имени

Я использую модуль 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'. любые предложения для этого пожалуйста?

Ответы

Ответ 1

Django хранит строку unicode с использованием кодовых точек и идентифицирует строку как unicode для дальнейшей обработки. UTF-8 использует четыре кодировки 8-битных байтов, поэтому строка unicode, используемая Django, должна быть декодирована или интерпретирована из нотации кода в ее нотации 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' в '\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-обозначением этих символов.

<div id="test">&#xC3;&#x85;&#xC5;</div>

Ответ 2

попробовать:

from __future__ import unicode_literals #Place as first import.

И/ИЛИ

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

Ответ 3

Только на этой неделе я столкнулся с аналогичной ошибкой кодирования. Я считаю, что проблема в том, что машинное кодирование отличается от машинного на Python. Попробуйте добавить это к вашим .bashrc или .zshrc.

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

Затем откройте новый терминал и снова запустите приложение Django.