У меня проблемы с работой символов юникода из текста, полученного с разных веб-страниц (на разных сайтах). Я использую BeautifulSoup.
Проблема в том, что ошибка не всегда воспроизводима; иногда он работает с некоторыми страницами, а иногда он бросает a UnicodeEncodeError
. Я перепробовал практически все, что мог придумать, и все же я не нашел ничего, что работало бы последовательно, не выдавая какую-то ошибку, связанную с Unicode.
Один из разделов кода, который вызывает проблемы, показан ниже:
agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
Вот трассировка стека, созданная для НЕКОТОРЫХ строк при выполнении приведенного выше фрагмента:
Traceback (most recent call last):
File "foobar.py", line 792, in <module>
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)
Я подозреваю, что это потому, что некоторые страницы (или, более конкретно, страницы с некоторых сайтов) могут быть закодированы, в то время как другие могут быть не закодированы. Все сайты базируются в Великобритании и предоставляют данные, предназначенные для потребления в Великобритании, поэтому не возникает проблем, связанных с интернализацией или работой с текстом, написанным на чем-либо, кроме английского.
У кого-нибудь есть идеи относительно того, как решить эту проблему, чтобы я ПОСТОЯННО исправил эту проблему?
источник
import os; import locale; os.environ["PYTHONIOENCODING"] = "utf-8"; myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8"); ... print(myText.encode('utf-8', errors='ignore'))
.$ export PYTHONIOENCODING=utf8
Ответы:
Вам нужно прочитать Python Unicode HOWTO . Эта ошибка - самый первый пример .
В основном, прекратите использование
str
для преобразования из юникода в кодированный текст / байты.Вместо этого правильно используйте
.encode()
для кодирования строки:или работать полностью в юникоде.
источник
print
мои строки utf-8, он работает хорошо. Однако, когда я передаю вывод своих программ в файл, он выдаетUnicodeEncodeError
. На самом деле, когда вывод перенаправляется (в файл или трубу), я считаю , чтоsys.stdout.encoding
этоNone
! Сцепление.encode('utf-8')
решает проблему.PYTHONIOENCODING=utf-8
вместо этого, то есть, напечатайте строки Unicode и позвольте среде установить ожидаемую кодировку..encode()
метода для вызова.Это классическая болевая точка Python Unicode! Учтите следующее:
Пока все хорошо, но если мы вызовем str (a), посмотрим, что произойдет:
Оу, это никому не поможет! Чтобы исправить ошибку, закодируйте байты явно .encode и сообщите python, какой кодек использовать:
Voil \ u00E0!
Проблема в том, что когда вы вызываете str (), python использует кодировку символов по умолчанию, чтобы попытаться закодировать предоставленные вами байты, которые в вашем случае иногда являются представлениями символов Юникода. Чтобы решить эту проблему, вы должны указать python, как обращаться со строкой, которую вы ей передаете, используя .encode ('what_unicode'). Большую часть времени вы должны быть в порядке, используя utf-8.
Для превосходного изложения на эту тему, см. Разговор PyCon Неда Бэтчелдера здесь: http://nedbatchelder.com/text/unipain.html
источник
None
значением.Я нашел изящную работу для меня, чтобы удалить символы и продолжать сохранять строку как строку следующим образом:
Важно отметить, что использование параметра игнорирования опасно, поскольку он молча отбрасывает любую поддержку юникода (и интернационализации) из кода, который его использует, как показано здесь (конвертировать юникод):
источник
yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
os.path.join()
, это очень хорошая привычка, когда вы начинаете заниматься кроссплатформенным программированием. :)Хорошо, я попробовал все, но это не помогло, после поиска в Google я понял следующее, и это помогло. Python 2.7 используется.
источник
if sys.version_info.major < 3:
Тонкая проблема, приводящая к сбою даже печати, заключается в неправильной установке переменных среды, например. здесь LC_ALL установлен в "C". В Debian не рекомендуется устанавливать его: вики Debian на Locale
источник
env|grep -E '(LC|LANG)'
.mc
в «режиме подоболочки» (Ctrl-O
) и я также забыл , что я добавил следующий псевдоним для удара:alias mc="LANG=en_EN.UTF-8 mc"
. Поэтому, когда я пытался запустить плохо написанные сценарии, которые основаны наru_RU.UTF-8
внутренних принципах, они просто умирали. Пробовал много вещей из этой темы, прежде чем я обнаружил реальную проблему. :)Для меня то, что сработало, было:
Надеюсь, это кому-нибудь поможет.
источник
На самом деле я обнаружил, что в большинстве моих случаев просто убрать этих персонажей гораздо проще:
источник
Проблема в том, что вы пытаетесь напечатать символ Unicode, но ваш терминал не поддерживает его.
Вы можете попробовать установить
language-pack-en
пакет, чтобы исправить это:который предоставляет обновления данных перевода на английский язык для всех поддерживаемых пакетов (включая Python). При необходимости установите другой языковой пакет (в зависимости от того, какие символы вы пытаетесь напечатать).
В некоторых дистрибутивах Linux это требуется для того, чтобы убедиться, что английские локали по умолчанию настроены правильно (чтобы символы юникода могли обрабатываться оболочкой / терминалом). Иногда это проще установить, чем настраивать вручную.
Затем при написании кода убедитесь, что вы используете правильную кодировку в своем коде.
Например:
Если проблема не устранена, дважды проверьте конфигурацию системы, например:
Ваш файл локали (
/etc/default/locale
), который должен иметь, например,или:
Значение в
LANG
/LC_CTYPE
в оболочке.Проверьте, какой язык поддерживает ваша оболочка:
Демонстрация проблемы и решения в новой виртуальной машине.
Инициализируйте и предоставьте виртуальную машину (например, используя
vagrant
):Смотрите: доступные коробки Ubuntu . ,
Печать символов Юникода (например, знака торговой марки
™
):Сейчас устанавливаю
language-pack-en
:Теперь проблема должна быть решена:
В противном случае попробуйте следующую команду:
источник
language-pack-en
общего с Python или с этим вопросом? AFAIK, он может предоставлять языковые переводы для сообщений, но не имеет ничего общего с кодировкой/etc/locale.gen
чтобы убедиться, что его языковой стандарт построен перед использованием?LANG
из/etc/default/locale
(как/etc/locale.gen
does't есть) и побежалlocale-gen
, но это не помогло. Я не уверен, чтоlanguage-pack-en
именно, так как я не нашел много документации, и перечисление содержания не очень помогает.LANG
/LC_CTYPE
/LC_ALL
вместо этого (например,LANG=C.UTF-8
).В ракушке:
Найдите поддерживаемую локаль UTF-8 с помощью следующей команды:
Экспортируйте его перед запуском скрипта, например:
или вручную, как:
Проверьте это, напечатав специальный символ, например
™
:Выше проверено в Ubuntu.
источник
Добавьте строку ниже в начале вашего скрипта (или как вторую строку):
Это определение кодировки исходного кода Python. Больше информации в PEP 263 .
источник
Вот перефразировка некоторых других так называемых «отписаться» ответов. Существуют ситуации, в которых простое выбрасывание проблемных символов / строк является хорошим решением, несмотря на протесты, озвученные здесь.
Тестирование это:
Результаты:
Предложение: вы можете назвать эту функцию
toAscii
вместо ? Это вопрос предпочтений.Это было написано для Python 2. Для Python 3, я думаю, вы захотите использовать,
bytes(obj,"ascii")
а неstr(obj)
. Я еще не проверял это, но я в какой-то момент пересмотрю ответ.источник
Я всегда помещаю код ниже в первые две строки файлов Python:
источник
Простые вспомогательные функции найдены здесь .
источник
backslashreplace
обработчик ошибок:u'\xa0'.encode('ascii', 'backslashreplace')
. Хотя вам следует избегать такого представления и настраивать свою среду так, чтобы вместо нее принимались символы не ascii - это 2016 год!Просто добавьте в переменную encode ('utf-8')
источник
Пожалуйста, откройте терминал и выполните следующую команду:
источник
Я просто использовал следующее:
Проверьте, что документация говорит об этом:
Решает это для меня. Просто и легко.
источник
Ниже решение работало для меня, только что добавил
(представляющий строку как юникод) перед моей строкой.
источник
Увы, это работает в Python 3 по крайней мере ...
Python 3
Иногда ошибка заключается в переменных окружения и заканчиваются так
где ошибки игнорируются при кодировании.
источник
У меня просто была эта проблема, и Google привел меня сюда, так что, чтобы добавить здесь общие решения, вот что сработало для меня:
У меня появилась эта идея после прочтения презентации Неда .
Я не утверждаю, что полностью понимаю, почему это работает, хотя. Так что если кто-то может отредактировать этот ответ или добавить комментарий, чтобы объяснить, я буду благодарен.
источник
type
ценность? до и после этого? Я думаю, почему это работает, потому что делаетunic += value
то же самое, чтоunic = unic + value
вы добавляете строку и юникод, где python затем принимает юникод для результирующего,unic
то есть более точного типа (подумайте, когда вы это сделаетеa = float(1) + int(1)
, онa
станет float) и затемvalue = unic
указываетvalue
на новыйunic
объект, который оказывается unicode.Мы столкнулись с этой ошибкой при запуске
manage.py migrate
в Django с локализованными приборами.Наш источник содержал
# -*- coding: utf-8 -*-
объявление, MySQL был правильно настроен для utf8, а Ubuntu имел соответствующий языковой пакет и значения в/etc/default/locale
.Проблема заключалась в том, что в контейнере Django (мы используем Docker) отсутствовал
LANG
env var.Установка
LANG
дляen_US.UTF-8
и перезапуска контейнера перед повторным запуском миграция исправила проблему.источник
Многие ответы здесь (например, @agf и @Andbdrew) уже касались самых непосредственных аспектов вопроса OP.
Тем не менее, я думаю, что есть один тонкий, но важный аспект, который был в значительной степени проигнорирован и который имеет большое значение для всех, кто, как я, попал сюда, пытаясь понять кодировки в Python: Python 2 и Python 3 управление представлением символов сильно отличается , Я чувствую, что большая неразбериха связана с людьми, которые читают о кодировках в Python, не зная версии.
Я предлагаю всем, кто заинтересован в понимании первопричины проблемы OP, начать с прочтения введения Спольски в представления символов и Unicode, а затем перейти к Batchelder в Unicode в Python 2 и Python 3.
источник
Старайтесь избегать преобразования переменной в str (переменную). Иногда это может вызвать проблему.
Простой совет, чтобы избежать:
Приведенный выше пример также разрешит ошибку кодирования.
источник
Если у вас есть что-то вроде
packet_data = "This is data"
этого, сделайте это на следующей строке, сразу после инициализацииpacket_data
:источник
Обновление для Python 3.0 и выше. Попробуйте следующее в редакторе python:
Это устанавливает кодировку системы по умолчанию в формате UTF-8.
Более подробно можно прочитать здесь, в PEP 538. - Приведение устаревшей локали C к локали на основе UTF-8 .
источник
У меня была эта проблема при попытке вывести символы Unicode
stdout
, но сsys.stdout.write
печатью (чтобы я мог также поддерживать вывод в другой файл).Из собственной документации BeautifulSoup я решил эту проблему с помощью библиотеки кодеков:
источник
Эта проблема часто возникает, когда проект django развертывается с использованием Apache. Потому что Apache устанавливает переменную окружения LANG = C в / etc / sysconfig / httpd. Просто откройте файл и прокомментируйте (или измените свой вариант) этот параметр. Или используйте опцию lang команды WSGIDaemonProcess, в этом случае вы сможете установить разные переменные среды LANG для разных виртуальных хостов.
источник
Рекомендованное решение не сработало для меня, и я мог жить со сбросом всех символов не ascii, поэтому
который оставил меня с чем-то раздетым, что не вызывает ошибок.
источник
Это будет работать:
Вывод:
источник
В общем случае записи этой неподдерживаемой строки кодирования (скажем
data_that_causes_this_error
) в какой-то файл (например,results.txt
), это работаетисточник