2016-02-24 1 views
-1
sys.getdefaultencoding() 
-> utf8 
test = u'tempête' 
test 
-> u'temp\xc3\xaate' 
print(test) 
-> tempête # WTF ? 

sys.setdefaultencoding('ascii') 
sys.getdefaultencoding() 
-> ascii 
test = u'tempête' 
test 
-> u'temp\xc3\xaate' 
print(test) 
-> tempête #... 

Я наблюдаю эти результаты, когда выполняю set_trace() из pdb.Python2.7 печатает неправильные символы из unicode с шестнадцатеричными символами

В python2.7 оболочки у меня есть правильный результат:

sys.getdefaultencoding() 
-> ascii 
test = u'tempête' 
test 
-> u'temp\xc3\xaate' 
print(test) 
-> tempête # WTF ? 

я борюсь с этим от часов ...

+0

Я не могу воссоздать проблему с питоном 2.7 – meltdown90

+0

В python2.7 оболочке , Я получаю 'AttributeError: объект NoneType 'не имеет атрибута' CodecInfo'' – zondo

+0

Пожалуйста, прямо сообщите нам вывод оболочки. – thebjorn

ответ

1

Убедитесь, что ваш locale кодирования соответствует эмулятору. Введите locale для проверки.

sys.setdefaultencoding() не имеет ничего общего с печатью - Python использует вашу локаль для установки кодировки stdout, используемой при печати. См. sys.stdout.encoding.

я могу частично воспроизвести вашу проблему так:

  1. Набор эмуляции терминала для: UTF-8
  2. Установить локали в en_GB.ISO8859-1. То есть Не UTF-8

    export LANG=en_GB.ISO8859-1 
    
  3. Выполнить код:

    >>> test = u'tempête' 
    >>> test 
    u'temp\xc3\xaate' 
    

Тот факт, что ê становится (U + 00C3) и ª (U + 00AA) является сутью проблемы , показывая, что Python считает, что кодировка должна быть 8-битным набором символов.

Я не могу повторить свои окончательные печати, но я подозреваю, возился с setdefaultencoding() и варил все - Смотрите мой ответ о том, почему это плохая идея: https://stackoverflow.com/a/34378962/1554386

+0

Благодарим за ваш ответ и тот, с которым вы связались, очень intereting! Но у меня все еще есть проблема, не уверен, связано ли это окончательно ... Я очищаю веб-страницу с charset 'iso-8859-1', scrapy возвращает unicode utf-8. Текст для обрезки - это «tempête», я поставил оператор 'pdb.set_trace()', чтобы проверить ответ, и он правильный: 'u'temp \ xc3 \ xaate'', но когда я попытался« распечатать »его , возникает та же проблема, что и выше: 'print (response) -> tempête'. Я пытаюсь поместить этот ответ в json-файл, и это также то, что напечатано в json-файле вместо «tempête». Есть какие-нибудь подсказки по этому поводу? – Pcriulan

+0

Хорошо, это типичная проблема [XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Слишком много предположений было сделано, когда проблема, вероятно, довольно проста в исходном коде. Пожалуйста, обновите вопрос с помощью фактического кода очистки. –

+0

Может быть, мне нужно создать совершенно новые вопросы, чтобы синхронизировать ком и ответы со старой темой? – Pcriulan