UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xa0' в позиции 20: порядковый номер не в диапазоне (128)

1301

У меня проблемы с работой символов юникода из текста, полученного с разных веб-страниц (на разных сайтах). Я использую 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)

Я подозреваю, что это потому, что некоторые страницы (или, более конкретно, страницы с некоторых сайтов) могут быть закодированы, в то время как другие могут быть не закодированы. Все сайты базируются в Великобритании и предоставляют данные, предназначенные для потребления в Великобритании, поэтому не возникает проблем, связанных с интернализацией или работой с текстом, написанным на чем-либо, кроме английского.

У кого-нибудь есть идеи относительно того, как решить эту проблему, чтобы я ПОСТОЯННО исправил эту проблему?

Homunculus Reticulli
источник
1
Если вы получаете эти ошибки как пользователь, а не как разработчик, проверьте serverfault.com/questions/54591/… и askubuntu.com/questions/599808/…
бразильский парень
Я добавлю этот пункт, не используйте onlinegdb.com/online_python_interpreter для этого материала. Использовал этот интерпретатор для пробной версии, и он не настроен правильно для Unicode! Всегда печатал в формате 'B' \ nnn '' ... когда все, что я хотел, было гильеметом! Пробовал на виртуальной
машине,
4
Попробуй это 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')).
HHH
@hhh Я запустил ваш фрагмент NameError: имя 'myText' не определено
KHAN
9
Попробуйте установить PYTHONIOENCODING в оболочке, прежде чем выполнять свой сценарий:$ export PYTHONIOENCODING=utf8
Noam Manos

Ответы:

1367

Вам нужно прочитать Python Unicode HOWTO . Эта ошибка - самый первый пример .

В основном, прекратите использование str для преобразования из юникода в кодированный текст / байты.

Вместо этого правильно используйте .encode()для кодирования строки:

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

или работать полностью в юникоде.

AGF
источник
23
согласовано! хорошее эмпирическое правило, которому меня учили, - использовать идею «сэндвича с юникодом». Ваш скрипт принимает байты из внешнего мира, но вся обработка должна выполняться в юникоде. Только когда вы готовы вывести свои данные, они должны быть переведены обратно в байты!
Andbdrew
256
В случае, если это смущает кого-то другого, я обнаружил странную вещь: мой терминал использует utf-8, и когда я использую printмои строки utf-8, он работает хорошо. Однако, когда я передаю вывод своих программ в файл, он выдает UnicodeEncodeError. На самом деле, когда вывод перенаправляется (в файл или трубу), я считаю , что sys.stdout.encodingэто None! Сцепление .encode('utf-8')решает проблему.
Древико
93
@drevicko: используйте PYTHONIOENCODING=utf-8вместо этого, то есть, напечатайте строки Unicode и позвольте среде установить ожидаемую кодировку.
JFS
1
@steinar: ничто не действует в каждом случае. Как правило, пользователю не нужно заботиться о том, чтобы вы использовали Python для реализации своей утилиты (интерфейс не должен меняться, если вы решили переопределить его на другом языке по какой-либо причине), и поэтому не следует ожидать, что этот пользователь даже знает о python- конкретные envvars. Плохой интерфейс заставляет пользователя указывать кодировку символов; при необходимости вставьте кодировку в формат отчета. Примечание: никакое жестко закодированное кодирование не может быть «разумным значением по умолчанию» в общем случае.
Jfs
13
Это плохой и запутанный совет. Люди используют str по той причине, что объект НЕ является строкой, поэтому нет .encode()метода для вызова.
Cerin
435

Это классическая болевая точка Python Unicode! Учтите следующее:

a = u'bats\u00E0'
print a
 => batsà

Пока все хорошо, но если мы вызовем str (a), посмотрим, что произойдет:

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

Оу, это никому не поможет! Чтобы исправить ошибку, закодируйте байты явно .encode и сообщите python, какой кодек использовать:

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

Voil \ u00E0!

Проблема в том, что когда вы вызываете str (), python использует кодировку символов по умолчанию, чтобы попытаться закодировать предоставленные вами байты, которые в вашем случае иногда являются представлениями символов Юникода. Чтобы решить эту проблему, вы должны указать python, как обращаться со строкой, которую вы ей передаете, используя .encode ('what_unicode'). Большую часть времени вы должны быть в порядке, используя utf-8.

Для превосходного изложения на эту тему, см. Разговор PyCon Неда Бэтчелдера здесь: http://nedbatchelder.com/text/unipain.html

Andbdrew
источник
85
Личное примечание: при попытке ввести ".encode" не вводите случайно ".unicode", а потом удивляйтесь, почему ничего не работает.
Пропустить Хаффман
9
Хороший совет. Но что вы делаете вместо этого, когда используете str (x) для печати объектов, которые могут быть или не быть строками? str (x) работает, если x - это число, дата, время, логическая или обычная строка. Внезапно, если это Unicode, он перестает работать. Есть ли способ получить такое же поведение, или теперь нам нужно добавить проверку IF, чтобы проверить, является ли объект строкой для использования .encode, и str () в противном случае?
Дирк Р
Тот же вопрос можно задать со Noneзначением.
Vadorequest
210

Я нашел изящную работу для меня, чтобы удалить символы и продолжать сохранять строку как строку следующим образом:

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

Важно отметить, что использование параметра игнорирования опасно, поскольку он молча отбрасывает любую поддержку юникода (и интернационализации) из кода, который его использует, как показано здесь (конвертировать юникод):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'
Макс Королевский
источник
17
Вы сделали мой день! Для utf-8 достаточно сделать:yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
luca76
для меня это сработало, но мой случай был другим, я сохранял имена файлов и имел «/» в имени, а путь не существовал, поэтому я должен использовать .replace («/», «») и таким образом сохранить мой сценарий. игнорирование ascii также работает для случая 'utf-8'.
Акаш Кандпал
1
@ harrypotter0 для правильного использования путей к файлам os.path.join(), это очень хорошая привычка, когда вы начинаете заниматься кроссплатформенным программированием. :)
login_not_failed
152

Хорошо, я попробовал все, но это не помогло, после поиска в Google я понял следующее, и это помогло. Python 2.7 используется.

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
Ashwin
источник
7
Не делай этого. stackoverflow.com/questions/3828723/… , хотя, когда у вас есть ответы, подобные этому stackoverflow.com/a/31137935/2141635 в верхней части результатов при поиске ошибки, я понимаю, почему это может показаться хорошей идеей.
Падрайк Каннингем
21
Я попробовал почти все предложения в этой теме, и на самом деле ни один из них не работал для меня. Наконец я попробовал это. И это действительно единственный, который работал просто и хорошо. Если кто-то скажет: «Не делайте этого, тогда придите с простым решением. В противном случае используйте это. Потому что это хорошая рабочая копия и прошлое решение»
Ричард де Ри,
4
Как это можно сделать в python3? Будем рады узнать.
Канерва Питер
3
После такого большого разочарования это сработало. Огромное спасибо.
Авраам Журба
4
Я бы просто добавилif sys.version_info.major < 3:
контракт профессора Фалькена нарушен
88

Тонкая проблема, приводящая к сбою даже печати, заключается в неправильной установке переменных среды, например. здесь LC_ALL установлен в "C". В Debian не рекомендуется устанавливать его: вики Debian на Locale

$ echo $LANG
en_US.utf8
$ echo $LC_ALL 
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà
maxpolk
источник
У меня точно такая же проблема, так что я не проверял ее до того, как сообщил . Большое спасибо. Кстати, вы можете заменить первые две команды на env|grep -E '(LC|LANG)'.
Дмитрий Верхотуров
Просто мои два цента по неправильной проблеме кодирования. Я часто использую mcв «режиме подоболочки» ( Ctrl-O) и я также забыл , что я добавил следующий псевдоним для удара: alias mc="LANG=en_EN.UTF-8 mc". Поэтому, когда я пытался запустить плохо написанные сценарии, которые основаны на ru_RU.UTF-8внутренних принципах, они просто умирали. Пробовал много вещей из этой темы, прежде чем я обнаружил реальную проблему. :)
login_not_failed
ТЫ ОБАЛДЕННЫЙ. В GSUTIL мой rsync не удался из-за именно этой проблемы. Исправил LC_ALL и все отлично работает как wine. <3 СПАСИБО <3
подписчик
27

Для меня то, что сработало, было:

BeautifulSoup(html_text,from_encoding="utf-8")

Надеюсь, это кому-нибудь поможет.

Animesh
источник
25

На самом деле я обнаружил, что в большинстве моих случаев просто убрать этих персонажей гораздо проще:

s = mystring.decode('ascii', 'ignore')
Фил ЛаНаса
источник
26
«Идеально» обычно не то, что он выполняет. Он выбрасывает вещи, которые вы должны выяснить, как правильно обращаться с.
tripleee
7
простое удаление «тех» (не английских) символов не является решением, так как python должен поддерживать все языки, как вы думаете?
Алемол
8
Downvoted. Это не правильное решение вообще. Узнайте, как работать с Unicode: joelonsoftware.com/articles/Unicode.html
Эндрю Ферье,
4
Смотри, самый разумный способ представить этот конкретный ответ заключается в следующем: признание того, что ascii предоставляет определенные привилегии определенным языкам и пользователям - это аварийный люк, который может быть использован для тех пользователей, которые могут взломать беглый, первый проход Можно создать сценарий вместе для предварительной работы до полной поддержки юникода.
LOL
5
Если я пишу сценарий, который просто должен напечатать текст на английском языке на стандартный вывод во внутреннем приложении компании, я просто хочу, чтобы проблема ушла. Что бы ни работало.
kagronick
25

Проблема в том, что вы пытаетесь напечатать символ Unicode, но ваш терминал не поддерживает его.

Вы можете попробовать установить language-pack-enпакет, чтобы исправить это:

sudo apt-get install language-pack-en

который предоставляет обновления данных перевода на английский язык для всех поддерживаемых пакетов (включая Python). При необходимости установите другой языковой пакет (в зависимости от того, какие символы вы пытаетесь напечатать).

В некоторых дистрибутивах Linux это требуется для того, чтобы убедиться, что английские локали по умолчанию настроены правильно (чтобы символы юникода могли обрабатываться оболочкой / терминалом). Иногда это проще установить, чем настраивать вручную.

Затем при написании кода убедитесь, что вы используете правильную кодировку в своем коде.

Например:

open(foo, encoding='utf-8')

Если проблема не устранена, дважды проверьте конфигурацию системы, например:

  • Ваш файл локали ( /etc/default/locale), который должен иметь, например,

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

    или:

    LC_ALL=C.UTF-8
    LANG=C.UTF-8
  • Значение в LANG/ LC_CTYPEв оболочке.

  • Проверьте, какой язык поддерживает ваша оболочка:

    locale -a | grep "UTF-8"

Демонстрация проблемы и решения в новой виртуальной машине.

  1. Инициализируйте и предоставьте виртуальную машину (например, используя vagrant):

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh

    Смотрите: доступные коробки Ubuntu . ,

  2. Печать символов Юникода (например, знака торговой марки ):

    $ python -c 'print(u"\u2122");'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128)
  3. Сейчас устанавливаю language-pack-en:

    $ sudo apt-get -y install language-pack-en
    The following extra packages will be installed:
      language-pack-en-base
    Generating locales...
      en_GB.UTF-8... /usr/sbin/locale-gen: done
    Generation complete.
  4. Теперь проблема должна быть решена:

    $ python -c 'print(u"\u2122");'
    
  5. В противном случае попробуйте следующую команду:

    $ LC_ALL=C.UTF-8 python -c 'print(u"\u2122");'
    
kenorb
источник
1
Что language-pack-enобщего с Python или с этим вопросом? AFAIK, он может предоставлять языковые переводы для сообщений, но не имеет ничего общего с кодировкой
Аластер МакКормак
2
В некоторых дистрибутивах Linux это требуется для того, чтобы убедиться, что английские локали по умолчанию настроены правильно, особенно при запуске скрипта Python в Терминале. Это сработало для меня в один момент. Смотрите: кодировка символов
kenorb
Ах хорошо. Вы имеете в виду, если вы хотите использовать не английский язык? Я предполагаю, что пользователь также должен будет отредактировать, /etc/locale.genчтобы убедиться, что его языковой стандарт построен перед использованием?
Аластер МакКормак
1
@AlastairMcCormack закомментирована LANGиз /etc/default/locale(как /etc/locale.gendoes't есть) и побежал locale-gen, но это не помогло. Я не уверен, что language-pack-enименно, так как я не нашел много документации, и перечисление содержания не очень помогает.
kenorb
1
маловероятно, что в настольной системе уже нет локалей utf-8, т. е. скорее всего вам не нужно ничего устанавливать, просто настройте LANG/ LC_CTYPE/ LC_ALLвместо этого (например, LANG=C.UTF-8).
JFS
19

В ракушке:

  1. Найдите поддерживаемую локаль UTF-8 с помощью следующей команды:

    locale -a | grep "UTF-8"
  2. Экспортируйте его перед запуском скрипта, например:

    export LC_ALL=$(locale -a | grep UTF-8)

    или вручную, как:

    export LC_ALL=C.UTF-8
  3. Проверьте это, напечатав специальный символ, например :

    python -c 'print(u"\u2122");'

Выше проверено в Ubuntu.

kenorb
источник
Да, это лучший короткий ответ, мы не можем изменить исходный код для использования .encode
Nguyen - Neo.Mxn0
16

Добавьте строку ниже в начале вашего скрипта (или как вторую строку):

# -*- coding: utf-8 -*-

Это определение кодировки исходного кода Python. Больше информации в PEP 263 .

Андрей Иванейко
источник
2
Это не решает проблему, когда обработанный текст, загруженный из внешнего файла, содержит кодировки utf-8. Это помогает только для литералов, написанных в самом скрипте Python, и является лишь подсказкой для интерпретатора Python, но не влияет на обработку текста.
Mikaelblomkvistsson
16

Вот перефразировка некоторых других так называемых «отписаться» ответов. Существуют ситуации, в которых простое выбрасывание проблемных символов / строк является хорошим решением, несмотря на протесты, озвученные здесь.

def safeStr(obj):
    try: return str(obj)
    except UnicodeEncodeError:
        return obj.encode('ascii', 'ignore').decode('ascii')
    except: return ""

Тестирование это:

if __name__ == '__main__': 
    print safeStr( 1 ) 
    print safeStr( "test" ) 
    print u'98\xb0'
    print safeStr( u'98\xb0' )

Результаты:

1
test
98°
98

Предложение: вы можете назвать эту функцию toAscii вместо ? Это вопрос предпочтений.

Это было написано для Python 2. Для Python 3, я думаю, вы захотите использовать, bytes(obj,"ascii")а не str(obj). Я еще не проверял это, но я в какой-то момент пересмотрю ответ.

BuvinJ
источник
8

Я всегда помещаю код ниже в первые две строки файлов Python:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
Pereira
источник
6

Простые вспомогательные функции найдены здесь .

def safe_unicode(obj, *args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, *args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')
Параг Тяги
источник
Чтобы получить сбежавшие байты (преобразовать произвольную строку Unicode в байты с использованием кодировки ASCII), вы можете использовать backslashreplaceобработчик ошибок: u'\xa0'.encode('ascii', 'backslashreplace'). Хотя вам следует избегать такого представления и настраивать свою среду так, чтобы вместо нее принимались символы не ascii - это 2016 год!
JFS
С Новым Годом @JFSebastian. Я просто был разочарован проблемой Python-Unicode, а затем, наконец, получил это решение, которое работало. Я не знал об этом. В любом случае спасибо за совет.
Параг Тяги
6

Просто добавьте в переменную encode ('utf-8')

agent_contact.encode('utf-8')
Кайрат Койбагаров
источник
4

Пожалуйста, откройте терминал и выполните следующую команду:

export LC_ALL="en_US.UTF-8"
Hồ Ngọc Vượng
источник
3

Я просто использовал следующее:

import unicodedata
message = unicodedata.normalize("NFKD", message)

Проверьте, что документация говорит об этом:

unicodedata.normalize (form, unistr) Возвращает форму обычной формы для строки Unicr Unicode. Допустимые значения для формы: «NFC», «NFKC», «NFD» и «NFKD».

Стандарт Unicode определяет различные формы нормализации строки Unicode на основе определения канонической эквивалентности и эквивалентности совместимости. В Unicode несколько символов могут быть выражены по-разному. Например, символ U + 00C7 (LATIN CAPITAL LETTER C с CEDILLA) также может быть выражен как последовательность U + 0043 (LATIN CAPITAL LETTER C) U + 0327 (КОМБИНИРОВАНИЕ CEDILLA).

Для каждого символа есть две нормальные формы: нормальная форма C и нормальная форма D. Нормальная форма D (NFD) также известна как каноническое разложение и переводит каждый символ в разложенную форму. Нормальная форма C (NFC) сначала применяет каноническую декомпозицию, затем снова создает предварительно объединенные символы.

В дополнение к этим двум формам существуют две дополнительные нормальные формы, основанные на эквивалентности совместимости. В Unicode поддерживаются определенные символы, которые обычно объединяются с другими символами. Например, U + 2160 (ROMAN NUMERAL ONE) действительно то же самое, что U + 0049 (LATIN CAPITAL LETTER I). Тем не менее, он поддерживается в Юникоде для совместимости с существующими наборами символов (например, gb2312).

Нормальная форма KD (NFKD) будет применять декомпозицию совместимости, то есть заменять все символы совместимости их эквивалентами. Нормальная форма KC (NFKC) сначала применяет декомпозицию совместимости, а затем каноническую композицию.

Даже если две строки Unicode нормализованы и выглядят одинаково для читателя-человека, если одна имеет комбинированные символы, а другая нет, они могут не совпадать.

Решает это для меня. Просто и легко.

Drag0
источник
3

Ниже решение работало для меня, только что добавил

ты "Струна"

(представляющий строку как юникод) перед моей строкой.

result_html = result.to_html(col_space=1, index=False, justify={'right'})

text = u"""
<html>
<body>
<p>
Hello all, <br>
<br>
Here's weekly summary report.  Let me know if you have any questions. <br>
<br>
Data Summary <br>
<br>
<br>
{0}
</p>
<p>Thanks,</p>
<p>Data Team</p>
</body></html>
""".format(result_html)
Аравинд Кришнакумар
источник
3

Увы, это работает в Python 3 по крайней мере ...

Python 3

Иногда ошибка заключается в переменных окружения и заканчиваются так

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'))

где ошибки игнорируются при кодировании.

HHH
источник
2

У меня просто была эта проблема, и Google привел меня сюда, так что, чтобы добавить здесь общие решения, вот что сработало для меня:

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

У меня появилась эта идея после прочтения презентации Неда .

Я не утверждаю, что полностью понимаю, почему это работает, хотя. Так что если кто-то может отредактировать этот ответ или добавить комментарий, чтобы объяснить, я буду благодарен.

pepoluan
источник
3
Какова typeценность? до и после этого? Я думаю, почему это работает, потому что делает unic += valueто же самое, что unic = unic + valueвы добавляете строку и юникод, где python затем принимает юникод для результирующего, unicто есть более точного типа (подумайте, когда вы это сделаете a = float(1) + int(1), он aстанет float) и затем value = unicуказывает valueна новый unicобъект, который оказывается unicode.
Том Мидделтын
2

Мы столкнулись с этой ошибкой при запуске manage.py migrate в Django с локализованными приборами.

Наш источник содержал # -*- coding: utf-8 -*-объявление, MySQL был правильно настроен для utf8, а Ubuntu имел соответствующий языковой пакет и значения в/etc/default/locale .

Проблема заключалась в том, что в контейнере Django (мы используем Docker) отсутствовал LANG env var.

Установка LANGдля en_US.UTF-8и перезапуска контейнера перед повторным запуском миграция исправила проблему.

followben
источник
1

Многие ответы здесь (например, @agf и @Andbdrew) уже касались самых непосредственных аспектов вопроса OP.

Тем не менее, я думаю, что есть один тонкий, но важный аспект, который был в значительной степени проигнорирован и который имеет большое значение для всех, кто, как я, попал сюда, пытаясь понять кодировки в Python: Python 2 и Python 3 управление представлением символов сильно отличается , Я чувствую, что большая неразбериха связана с людьми, которые читают о кодировках в Python, не зная версии.

Я предлагаю всем, кто заинтересован в понимании первопричины проблемы OP, начать с прочтения введения Спольски в представления символов и Unicode, а затем перейти к Batchelder в Unicode в Python 2 и Python 3.

Симон Рамирес Амая
источник
да, моя ошибка была на python 2.7, 'a'.format (u'ñ'), и правильным решением было бы не использовать .encode ('utf-8'), а всегда использовать строки в кодировке Unicode (по умолчанию в python 3 ): u'a'.format (u'ñ '),
Rogelio
1

Старайтесь избегать преобразования переменной в str (переменную). Иногда это может вызвать проблему.

Простой совет, чтобы избежать:

try: 
    data=str(data)
except:
    data = data #Don't convert to String

Приведенный выше пример также разрешит ошибку кодирования.

Сэм Рубен
источник
это doens't работа , как вы просто столкнетесь с ошибкой в исключением
Aurèle COLLINET
0

Если у вас есть что-то вроде packet_data = "This is data"этого, сделайте это на следующей строке, сразу после инициализации packet_data:

unic = u''
packet_data = unic
Нандан Кулкарни
источник
0

Обновление для Python 3.0 и выше. Попробуйте следующее в редакторе python:

locale-gen en_US.UTF-8
export LANG=en_US.UTF-8 LANGUAGE=en_US.en
LC_ALL=en_US.UTF-8

Это устанавливает кодировку системы по умолчанию в формате UTF-8.

Более подробно можно прочитать здесь, в PEP 538. - Приведение устаревшей локали C к локали на основе UTF-8 .

ZF007
источник
0

У меня была эта проблема при попытке вывести символы Unicode stdout, но сsys.stdout.write печатью (чтобы я мог также поддерживать вывод в другой файл).

Из собственной документации BeautifulSoup я решил эту проблему с помощью библиотеки кодеков:

import sys
import codecs

def main(fIn, fOut):
    soup = BeautifulSoup(fIn)
    # Do processing, with data including non-ASCII characters
    fOut.write(unicode(soup))

if __name__ == '__main__':
    with (sys.stdin) as fIn: # Don't think we need codecs.getreader here
        with codecs.getwriter('utf-8')(sys.stdout) as fOut:
            main(fIn, fOut)
palswim
источник
0

Эта проблема часто возникает, когда проект django развертывается с использованием Apache. Потому что Apache устанавливает переменную окружения LANG = C в / etc / sysconfig / httpd. Просто откройте файл и прокомментируйте (или измените свой вариант) этот параметр. Или используйте опцию lang команды WSGIDaemonProcess, в этом случае вы сможете установить разные переменные среды LANG для разных виртуальных хостов.

shmakovpn
источник
0

Рекомендованное решение не сработало для меня, и я мог жить со сбросом всех символов не ascii, поэтому

s = s.encode('ascii',errors='ignore')

который оставил меня с чем-то раздетым, что не вызывает ошибок.

Gulzar
источник
0

Это будет работать:

 >>>print(unicodedata.normalize('NFD', re.sub("[\(\[].*?[\)\]]", "", "bats\xc3\xa0")).encode('ascii', 'ignore'))

Вывод:

>>>bats
Хузефа Усама
источник
0

В общем случае записи этой неподдерживаемой строки кодирования (скажем data_that_causes_this_error) в какой-то файл (например, results.txt), это работает

f = open("results.txt", "w")
  f.write(data_that_causes_this_error.encode('utf-8'))
  f.close()
Пе Дро
источник