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


1296

У мене проблеми з символами Unicode з тексту, отриманого з різних веб-сторінок (на різних сайтах). Я використовую BeautifulSoup.

Проблема полягає в тому, що помилка не завжди відтворюється; іноді він працює з деякими сторінками, а іноді - барфікує, кидаючи 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)

Я підозрюю, що це тому, що деякі сторінки (або більш конкретно, сторінки з деяких сайтів) можуть бути закодовані, а інші можуть бути незашифрованими. Усі веб-сайти знаходяться у Великобританії та надають дані, призначені для споживання у Великобританії - тому жодних питань, пов'язаних з інтерналізацією чи спілкуванням з текстом, написаним іншим, крім англійської, не існує.

У когось є ідеї, як це вирішити, щоб я міг КОНСИСТИЧНО виправити цю проблему?


1
Якщо ви отримуєте ці помилки як користувач, а не як розробник, перевірте serverfault.com/questions/54591/… та askubuntu.com/questions/599808/…
Цей бразильський хлопець,

Я додам, що цей пункт не використовуйте для цих матеріалів onlinegdb.com/online_python_interpreter . Використовував цей інтерпретатор для випробування матеріалів, і він не налаштований правильно для Unicode! Завжди друкувався у форматі "B" \ nnn "", коли все, що я хотів, - це гільємет! Спробував на VM, і він працював негайно, як очікувалося, використовуючи chr ()
JGFMK

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 irfan

9
Спробуйте встановити PYTHONIOENCODING в оболонці, перш ніж виконати свій сценарій:$ export PYTHONIOENCODING=utf8
Noam Manos

Відповіді:


1361

Вам потрібно прочитати HITTO Python Unicode . Ця помилка - найперший приклад .

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

Натомість правильно використовуйте .encode()для кодування рядка:

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

або повністю працювати в unicode.


23
домовились! хорошим правилом, якого я навчив, є використання ідеї "сендвіч" унікоду. Ваш сценарій приймає байти із зовнішнього світу, але всю обробку слід виконувати в унікоді. Тільки тоді, коли ви готові вивести свої дані, їх слід повернути в байти!
Andbdrew

256
У випадку, якщо хтось інший заплутається у цьому, я виявив дивну річ: мій термінал використовує utf-8, а коли я printмою строку utf-8, це працює чудово. Однак, коли я передаю вихідні програми у файл, він видає a UnicodeEncodeError. Насправді, коли вихід перенаправляється (до файлу чи труби), я вважаю, що sys.stdout.encodingце None! Прийняття рішення .encode('utf-8')вирішує проблему.
drevicko

93
@drevicko: використовуйте PYTHONIOENCODING=utf-8натомість тобто, друкуйте рядки Unicode і нехай середовище встановлює очікуване кодування.
jfs

1
@steinar: нічого не діє в кожному випадку. Взагалі, користувачеві не повинно бути байдуже, що ви використовуєте Python для реалізації своєї утиліти (інтерфейс не повинен змінюватися, якщо ви вирішите повторно впровадити його іншою мовою з будь-якої причини), і тому ви не повинні сподіватися, що користувач навіть знає про python- специфічні оточення. Погано користувальницький інтерфейс змусити користувача вказати кодування символів; при необхідності вставити кодування символів у формат звіту. Примітка: жодне жорстке кодування не може бути "розумним за замовчуванням" у загальному випадку.
jfs

13
Це погані та заплутані поради. Причина, по якій люди використовують str, полягає в тому, що об'єкт НЕ вже рядок, тому немає .encode()способу викликати.
Серін

433

Це класична больова точка з однотонним пітоном! Розглянемо наступне:

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à

Вулиця \ u00E0!

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

Про чудову викладку з цієї теми дивіться розмову про PyCon Неда Батчелдера тут: http://nedbatchelder.com/text/unipain.html


85
Особиста примітка: Коли ви намагаєтеся ввести ".encode" не випадково введіть ".unicode", тоді задайтеся питанням, чому нічого не працює.
Пропустити Хаффмана

9
Хороша порада. Але що робити замість цього, коли ви використовували str (x) для друку об'єктів, які можуть бути, а можуть і не бути рядками? str (x) працює, якщо x - це число, час дати, булева чи звичайна рядок. Раптом, якщо є його unicode, він перестає працювати. Чи є спосіб отримати таку саму поведінку чи нам зараз потрібно додати IF-чек, щоб перевірити, чи об'єкт є рядковим для використання .encode, а str () в іншому випадку?
Дірк Р

Це ж питання можна задати і Noneціннісно.
Vadorequest

210

Я знайшов для себе елегантну роботу над тим, щоб видалити символи та продовжувати зберігати рядок як рядок наступним чином:

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

Важливо зауважити, що використання параметра ігнорування небезпечно, оскільки воно мовчки скидає будь-яку підтримку unicode (та інтернаціоналізації) з коду, який використовує її, як показано тут (перетворити unicode):

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

добре, я спробував усе, але це не допомогло, після гугл я зрозумів наступне, і це допомогло. python 2.7 використовується.

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

7
Не робіть цього. stackoverflow.com/questions/3828723/… , хоча коли у вас є відповіді на зразок цієї stackoverflow.com/a/31137935/2141635 під час пошуку помилок, я можу зрозуміти, чому це може здатися гарною ідеєю.
Padraic Cunningham

21
Я спробував майже всі пропозиції в цій темі, і справді жодна не працювала для мене. Нарешті я спробував цей. І це справді ТІЛЬКИЙ, який працював просто і добре. Якщо хтось скаже: "Не робіть цього, тоді виходьте з простим рішенням. В іншому випадку використовуйте це. Тому що це хороша робоча копія та минуле рішення.
Річард де Рій

4
Як це можна зробити в python3? Буду рада знати.
Канерва Петра

3
Після стількох розчарувань цей спрацював. Дякую купу.
Аврахам Журба

4
Я просто додамif sys.version_info.major < 3:
контракт професора Фолкена порушено

87

Тонка проблема, що призводить до виходу з ладу навіть друку, полягає в неправильному встановленні змінних оточення, наприклад. тут 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à

Отримав саме таку проблему, так погано, що я не перевіряв її перед тим, як звітувати . Дуже дякую. До речі, ви можете замінити перші дві команди на 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 і все працює добре, як вино. <3
ДЯКУЙТЕ

27

Для мене те, що працювало:

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

Сподіваюся, що це комусь допоможе.


25

Насправді я виявив, що в більшості випадків просто викреслити цих персонажів набагато простіше:

s = mystring.decode('ascii', 'ignore')

26
"Ідеально" - це звичайно не те, що воно виконує. Він викидає речі, з якими слід з’ясувати, як правильно поводитися.
трійка

7
просто зняття "тих" (не англійських) символів не є рішенням, оскільки python повинен підтримувати всі мови, чи не думаєте ви?
alemol

8
Захищений. Це зовсім не правильне рішення. Дізнайтеся, як працювати з Unicode: joelonsoftware.com/articles/Unicode.html
Andrew Ferrier

4
Подивіться, найбільш розумний спосіб представити цю конкретну відповідь таким чином: визнання того, що ascii надає певну привілей певним мовам та користувачам - це евакуаційний люк, який може бути використаний для тих користувачів, які, можливо, зламають короткий перехід, перший пропуск , сценарій разом потенційно для попередньої роботи перед реалізацією повної підтримки unicode.
lol

5
Якщо я пишу сценарій, який просто повинен надрукувати англійський текст для stdout у внутрішній програмі компанії, я просто хочу, щоб проблема усунулася. Що б не працювало.
kagronick

25

Проблема полягає в тому, що ви намагаєтеся надрукувати символ unicode, але ваш термінал не підтримує його.

Ви можете спробувати встановити language-pack-enпакет, щоб виправити це:

sudo apt-get install language-pack-en

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

У деяких дистрибутивах Linux це потрібно для того, щоб переконатися, що англійські локалі за замовчуванням налаштовані належним чином (тому символами unicode можна обробляти оболонку / термінал). Іноді його простіше встановити, ніж налаштувати вручну.

Потім під час написання коду обов'язково використовуйте правильне кодування у своєму коді.

Наприклад:

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. Ініціалізуйте та надайте VM (наприклад, використовуючи vagrant):

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh

    Дивіться: доступні коробки Ubuntu . .

  2. Друк символів unicode (таких як знак торгової марки ):

    $ 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");'
    

1
Що language-pack-enстосується Python чи цього питання? AFAIK, він може надавати мовні переклади повідомлень, але не має нічого спільного з кодуванням
Alastair McCormack

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.


Так, це найкраща коротка відповідь, ми не можемо змінити вихідний код для використання .encode
Luat 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). Я цього ще не перевіряв, але в якийсь момент я перегляну відповідь.


8

Я завжди ставлю код нижче в перших двох рядках файлів python:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

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, а потім нарешті отримав це рішення, яке працювало. Я про це не знав. Все одно дякую за пораду.
Parag Tiagi -morpheus-



3

Я просто використав наступне:

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

Перевірте, що документація говорить про це:

unicodedata.normalize (form, unistr) Повернення нормальної форми форми для рядка Unicode unistr. Дійсні значення для форми - "NFC", "NFKC", "NFD" та "NFKD".

Стандарт Unicode визначає різні форми нормалізації рядка Unicode, засновані на визначенні канонічної еквівалентності та еквівалентності сумісності. У Unicode кілька символів можуть бути виражені різними способами. Наприклад, символ U + 00C7 (LATIN CAPITAL LETTER C CEDILLA) також може бути виражений як послідовність U + 0043 (LATIN CAPITAL LETTER C) U + 0327 (COMBINING CEDILLA).

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

Окрім цих двох форм, існують дві додаткові нормальні форми, засновані на еквівалентності сумісності. У Unicode підтримуються певні символи, які зазвичай були б уніфіковані з іншими символами. Наприклад, U + 2160 (ROMAN NUMERAL ONE) - це дійсно те саме, що U + 0049 (LATIN CAPITAL LETTER I). Однак він підтримується в Unicode для сумісності з існуючими наборами символів (наприклад, gb2312).

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

Навіть якщо два рядки unicode нормалізовані і виглядають однаково для людського читача, якщо в одного є об'єднані символи, а в іншого немає, вони можуть не порівнювати рівних.

Вирішує це для мене. Просто і легко.


3

Нижче рішення працювало на мене, щойно додав

u "Рядок"

(представляє рядок як unicode) перед моєю рядком.

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 принаймні ...

Пітон 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'))

де помилки ігноруються при кодуванні.


2

У мене просто була ця проблема, і Google привів мене сюди, тому просто для додання тут загальних рішень це те, що для мене спрацювало:

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

У мене була така ідея, прочитавши презентацію Неда .

Я не претендую на те, щоб повністю зрозуміти, чому це працює. Тож, якщо хтось може відредагувати цю відповідь або поставити коментар для пояснення, я буду вдячний.


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

2

Ми виявили цю помилку під час запуску manage.py migrate в Джанго за допомогою локалізованих світильників.

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

Проблема полягала лише в тому, що в контейнері Django (ми використовуємо докер) відсутній LANG env var.

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


1

Багато відповідей тут (наприклад, @agf та @Andbdrew) вже стосувалися найбільш безпосередніх аспектів питання щодо ОП.

Однак я думаю, що є один тонкий, але важливий аспект, який значною мірою ігнорується, і який дуже важливий для всіх, хто, як я, опинився тут, намагаючись зрозуміти кодування в Python: Управління представленням персонажів Python 2 проти Python 3 дивовижно відрізняється . Я відчуваю, що велика плутанина там пов'язана з тим, що люди читають про кодування в Python, не знаючи версії.

Я пропоную всім, хто зацікавлений у розумінні першопричини проблеми ОП, для початку прочитати вступ Спольського до представлень символів та Unicode, а потім перейти до Batchelder на Unicode в Python 2 та Python 3.


так, моя помилка була в python 2.7, 'a'.format (u'ñ'), і правильне рішення - не використовувати .encode ('utf-8'), а використовувати завжди рядки unicode, (за замовчуванням у python 3 ): u'a'.format (і'п '),
Рохеліо

1

Намагайтеся уникати перетворення змінної в str (змінну). Іноді це може спричинити проблему.

Простий рада, якого слід уникати:

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

Наведений вище приклад також вирішить помилку кодування.


це не спрацює, оскільки ви просто зіткнетесь з помилкою, за винятком
Aurele 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 .


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)

0

Ця проблема часто виникає, коли проект django розгортається за допомогою Apache. Оскільки Apache встановлює змінну середовища LANG = C в / etc / sysconfig / httpd. Просто відкрийте файл і прокоментуйте (або змініть на ваш колір) цей параметр. Або скористайтесь опцією lang команди WSGIDaemonProcess, в цьому випадку ви зможете встановити різні змінні середовища LANG для різних віртуальних хостів.


0

Рекомендоване рішення не спрацювало для мене, і я міг би жити з демпінгом усіх символів, які не є ascii

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

що залишило мене з чистим позбавленим, що не кидає помилок.


0

Це спрацює:

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

Вихід:

>>>bats
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.