Ошибка кодирования оболочки Django (только Debian, Ubuntu отлично) - PullRequest
2 голосов
/ 15 сентября 2011

Добрый день

Может кто-нибудь объяснить, что происходит за консолью Django manage.py? Проблема в следующем. Я разрабатываю приложение Django, которое использует urllib для анализа некоторых HTML-страниц, чтобы получить от них некоторую информацию. И эта информация на русском языке, поэтому она должна быть в кодировке Unicode (в данном случае это адресная строка). Далее мой скрипт передает это в какой-то другой сторонний модуль, который падает, потому что это недопустимая строка в кодировке Юникод (я пытаюсь геодезировать точку с адреса). Я попытался напечатать строку (в данном случае проанализированный адрес) на консоль с помощью команды print address, но это не удалось:

File "<console>", line 1, in <module>
... some useless stacktrace ...    
    print address
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

Теперь самое интересное.
У меня есть 2 компьютера: рабочая станция с Ubuntu и Python 2.7.2 и Debian Lenny VPS с Python 2.7.2. Я запускаю парсер одинаково на обеих машинах: выполняя python manage.py shell и вызывая с него свою функцию.
Сначала я получил одинаковую ошибку в обеих установках, но затем я заметил, что моя кодировка python установлена ​​на «ascii» (import sys; sys.getdefaultencoding()). И когда я ставлю

import sys; reload(sys).setdefaultencoding('utf-8')

в settings.py проблема решается для Ubuntu. Теперь я получаю соответствующую печать, например, г. Челябинск, ул. Кирова, д. 27, КТК Набережный, но это не работает для Debian.

Если я удаляю эту print address строку, чем, я получаю нечитаемые ошибки геолокации, но опять же - только в Debian. Ubuntu работает просто отлично:

Failed to geodecode address [г. ЧелÑбинÑк, Ñл. 1-ой ÐÑÑилеÑки, 17/1, ÑÑнок ÐÑÑак, 1-з]

Никакое количество unicode(address).encode('utf-8') магии не может помочь в этом.

Так что я просто не могу получить это. Какие различия между машинами доставляют мне столько хлопот?

1 Ответ

3 голосов
/ 16 сентября 2011

Если вы запустите следующий скрипт на python, вы увидите, что происходит:

# -*- coding: utf-8 -*-
a = r"Челябинск"
print "Encode from UTF-8 to UTF-8:",unicode(a,'utf-8').encode('utf-8')
print "Encode from ISO8859-1 to UTF-8:",unicode(a,'iso8859-1').encode('utf-8')

Вывод:

Кодирование из ISO8859-1 в UTF-8:Челябинск

Кодирование из ISO8859-1 в UTF-8: ЧеР»ÑÐ ± инÑк

По сути, вы берете строку, закодированную (уже) как UTF-8 и перекодировать его (второй раз, как если бы это был ISO8859-1) в UTF-8.

Стоит проверить, какая кодировка машины используется по умолчанию в каждом случае.

Если кто-то может добавить к этому ответу, пожалуйста, сделайте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...