UnicodeEncodeError: kodek 'ascii' nie może zakodować znaku u '\xa0 ' w pozycji 20: ordinal not in range (128)

Mam problemy z obsługą znaków unicode z tekstu pobranego z różnych stron internetowych (na różnych stronach). Używam BeautifulSoup.

Problem polega na tym, że błąd nie zawsze jest powtarzalny; czasami działa z niektórymi stronami, a czasami wymiotuje rzucając UnicodeEncodeError. Próbowałem prawie wszystkiego, co mogę wymyślić, a jednak nie znalazłem niczego, co działa konsekwentnie bez rzucania jakiegoś błędu związanego z Unicode.

Jeden z sekcje kodu, które powodują problemy, pokazano poniżej:

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

Oto ślad stosu wytwarzany na niektórych łańcuchach, gdy powyższy fragment jest uruchamiany:

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)

Podejrzewam, że dzieje się tak dlatego, że niektóre strony (a dokładniej strony z niektórych stron) mogą być zakodowane, podczas gdy inne mogą być niekodowane. Wszystkie witryny mają siedzibę w Wielkiej Brytanii i dostarczają dane przeznaczone do konsumpcji w Wielkiej Brytanii - więc nie ma problemów związanych z internalizacją lub radzeniem sobie z tekstem napisanym w czymkolwiek innym niż Angielski.

Czy ktoś ma jakieś pomysły, jak to rozwiązać, abym mógł konsekwentnie rozwiązać ten problem?

Author: shaneb, 2012-03-30

29 answers

Musisz przeczytać Python Unicode HOWTO. Ten błąd jest pierwszym przykładem .

Zasadniczo, przestań używać str do konwersji z unicode na zakodowany tekst / bajty.

Zamiast tego, prawidłowo używać .encode() aby zakodować ciąg znaków:

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

Lub działa w całości w unicode.

 1423
Author: agf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-04 22:59:40

To jest klasyczny python unicode pain point! Rozważmy następujące:

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

Jak na razie wszystko dobrze, ale jeśli wywołamy str(a), zobaczmy co się stanie:

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)
O dip, to nikomu nic dobrego nie da! Aby naprawić błąd, koduj bajty jawnie za pomocą .koduj i powiedz pythonowi, jakiego kodeka użyć:
a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà
Voil\u00E0!

Problem polega na tym, że gdy wywołujesz str (), python używa domyślnego kodowania znaków, aby spróbować zakodować podane przez Ciebie bajty, co w Twoim przypadku są czasami reprezentacjami znaków unicode. Aby rozwiązać problem, musisz powiedzieć pythonowi, jak radzić sobie z ciągiem, który podajesz, używając go .encode ('whatever_unicode'). Przez większość czasu powinno być dobrze używając utf-8.

Dla doskonałej ekspozycji na ten temat, zobacz Referat Neda Batcheldera PyCon tutaj: http://nedbatchelder.com/text/unipain.html

 452
Author: Andbdrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-02 14:16:05

Znalazłem elegancką pracę wokół mnie, aby usunąć Symbole i nadal zachować ciąg jako ciąg w następujący sposób:

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

Ważne jest, aby zauważyć, że użycie opcji Ignoruj jest niebezpieczne , ponieważ po cichu usuwa wsparcie dla unicode (i internacjonalizacji) z kodu, który go używa, Jak pokazano tutaj (convert unicode):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'
 225
Author: Max Korolevsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-19 14:42:35

Cóż, próbowałem wszystkiego, ale to nie pomogło, po googlowaniu zorientowałem się, co następuje i pomogło. python 2.7 jest w użyciu.

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
 170
Author: Ashwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-02 13:10:37

Subtelnym problemem powodującym niepowodzenie drukowania jest błędne ustawienie zmiennych środowiskowych, np. tutaj LC_ALL ustawione na "C". W Debianie zniechęcają do jej ustawienia: Debian wiki on 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à
 94
Author: maxpolk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-02 18:04:24

Problem polega na tym, że próbujesz wydrukować znak unicode, ale twój terminal go nie obsługuje.

Możesz spróbować zainstalować language-pack-en pakiet, aby to naprawić:

sudo apt-get install language-pack-en

Który zapewnia aktualizacje danych w języku angielskim dla wszystkich obsługiwanych pakietów (w tym Pythona). W razie potrzeby zainstaluj inny pakiet językowy (w zależności od znaków, które próbujesz wydrukować).

W niektórych dystrybucjach Linuksa jest to wymagane, aby upewnić się, że domyślny angielski ustawienia regionalne są poprawnie skonfigurowane (więc znaki unicode mogą być obsługiwane przez powłokę/terminal). Czasami łatwiej jest go zainstalować, niż skonfigurować ręcznie.

Następnie podczas pisania kodu upewnij się, że używasz odpowiedniego kodowania w kodzie.

Na przykład:

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

Jeśli nadal masz problem, sprawdź dokładnie konfigurację systemu, na przykład:

  • Twój plik locale (/etc/default/locale), który powinien mieć np.

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

    Lub:

    LC_ALL=C.UTF-8
    LANG=C.UTF-8
    
  • Wartość LANG/LC_CTYPE w skorupie.

  • Sprawdź, które locale obsługuje twoja powłoka przez:

    locale -a | grep "UTF-8"
    

Pokazanie problemu i rozwiązania w nowej maszynie wirtualnej.

  1. Inicjalizuj i udostępniaj maszynę wirtualną (np. używając vagrant):

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh
    

    Zobacz: dostępne pudełka Ubuntu ..

  2. Drukowanie znaków unicode (takich jak znak towarowy jak ):

    $ 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. Teraz zainstaluj 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. Teraz problem powinien zostać rozwiązany:

    $ python -c 'print(u"\u2122");'
    ™
    
  5. W przeciwnym razie spróbuj wykonać następujące polecenie:

    $ LC_ALL=C.UTF-8 python -c 'print(u"\u2122");'
    ™
    
 29
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-30 20:13:55

Faktycznie odkryłem, że w większości moich przypadków samo usunięcie tych znaków jest znacznie prostsze:

s = mystring.decode('ascii', 'ignore')
 27
Author: Phil LaNasa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-01 13:44:36

Dla mnie to co działało to:

BeautifulSoup(html_text,from_encoding="utf-8")
Mam nadzieję, że to komuś pomoże.
 27
Author: Animesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-26 14:53:34

W powłoce:

  1. Znajdź obsługiwane ustawienia regionalne UTF-8 za pomocą następującego polecenia:

    locale -a | grep "UTF-8"
    
  2. Wyeksportuj go przed uruchomieniem skryptu, np.:

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

    Lub ręcznie jak:

    export LC_ALL=C.UTF-8
    
  3. Przetestuj go, drukując znak specjalny, np. :

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

Powyżej testowane w Ubuntu.

 25
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-30 20:21:40

Oto powtórka z innych tzw." cop out " odpowiedzi. Są sytuacje, w których po prostu wyrzucenie kłopotliwych znaków/ciągów jest dobrym rozwiązaniem, mimo protestów wyrażanych tutaj.

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

Testowanie:

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

Wyniki:

1
test
98°
98

UPDATE: moja oryginalna odpowiedź została napisana dla Pythona 2. For Python 3:

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

Uwaga: jeśli wolisz zostawić wskaźnik ? gdzie znajdują się" niebezpieczne " znaki unicode, podaj replace zamiast ignore w wywołaniu kodowania dla obsługi błędów.

Sugestia: możesz zamiast tego nazwać tę funkcję toAscii? To kwestia preferencji...

Wreszcie, oto bardziej solidna wersja PY2/3 z użyciem six, gdzie zdecydowałem się użyć replace, i peppered w niektórych zamianach znaków, aby zastąpić fantazyjne cudzysłowy i apostrofy unicode, które zwijają się w lewo lub w prawo z prostymi pionowymi, które są częścią zestawu ascii. Możesz rozszerzyć na takie swapy siebie:

from six import PY2, iteritems 

CHAR_SWAP = { u'\u201c': u'"'
            , u'\u201D': u'"' 
            , u'\u2018': u"'" 
            , u'\u2019': u"'" 
}

def toAscii( text ) :    
    try:
        for k,v in iteritems( CHAR_SWAP ): 
            text = text.replace(k,v)
    except: pass     
    try: return str( text ) if PY2 else bytes( text, 'replace' ).decode('ascii')
    except UnicodeEncodeError:
        return text.encode('ascii', 'replace').decode('ascii')
    except: return ""

if __name__ == '__main__':     
    print( toAscii( u'testin\u2019' ) )
 18
Author: BuvinJ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-11-02 14:38:22

Dodaj wiersz poniżej na początku skryptu ( lub jako drugi wiersz):

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

To definicja kodowania kodu źródłowego Pythona. Więcej informacji w PEP 263 .

 15
Author: Andriy Ivaneyko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-08 10:17:31

Zawsze umieszczam poniższy kod w dwóch pierwszych linijkach plików Pythona:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
 8
Author: Pereira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-27 14:40:22

niestety działa to przynajmniej w Pythonie 3...

Python 3

Czasami błąd jest w zmiennych środowiska i enconding tak

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

Gdzie błędy są ignorowane w kodowaniu.

 7
Author: hhh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-15 21:49:34

Proste funkcje pomocnicze znaleziono Tutaj .

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')
 6
Author: Parag Tyagi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-31 11:18:22

Wystarczy dodać do zmiennej encode ('utf-8')

agent_contact.encode('utf-8')
 6
Author: Kairat Koibagarov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-31 05:50:36

Właśnie użyłem:

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

Sprawdź, co mówi o tym dokumentacja:

Unicodedata.normalize (form, unistr) Zwraca postać normalną dla ciąg Unicode unistr. Poprawne wartości dla formularza to "NFC", "NFKC", "NFD" i "NFKD".

Standard Unicode definiuje różne formy normalizacji Unicode ciąg, oparty na definicji równoważności kanonicznej i równoważność zgodności. W Unicode kilka znaków może być wyrażone w różny sposób. Na przykład znak U + 00C7 (łac. Wielka litera C z CEDILLĄ) może być również wyrażona jako ciąg U + 0043 (ŁACIŃSKA WIELKA LITERA C) U + 0327 (ŁĄCZĄCY CEDILLA).

Dla każdego znaku istnieją dwie normalne formy: normalna forma C i postać normalna D. postać normalna D (NFD) jest również znana jako kanoniczna dekompozycji i przekłada każdą postać na jej rozkładaną postać. Postać normalna C (NFC) najpierw stosuje rozkład kanoniczny, następnie komponuje ponownie połączone znaki.

Oprócz tych dwóch form, istnieją dwie dodatkowe normalne formy na podstawie równoważności zgodności. W Unicode niektóre znaki to obsługiwane, które normalnie byłyby zunifikowane z innymi znakami. Na przykład: U+2160 (cyfra rzymska) to tak naprawdę to samo co U+0049 (ŁACIŃSKA WIELKA LITERA I). Jednak jest on obsługiwany w Unicode dla zgodność z istniejącymi zestawami znaków (np. gb2312).

Postać normalna KD (NFKD) zastosuje rozkład zgodności, tj. Zastąp wszystkie Znaki zgodności ich odpowiednikami. Na postać normalna KC (NFKC) najpierw stosuje rozkład zgodności, następnie kompozycja kanoniczna.

Nawet jeśli dwa ciągi unicode są znormalizowane i wyglądają tak samo do czytelnika ludzkiego, jeśli jeden ma znaki łączące, a drugi nie, mogą nie być równe.

Rozwiązuje to za mnie. Proste i łatwe.
 4
Author: Drag0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-27 21:59:51

Otwórz terminal i uruchom poniższe polecenie:

export LC_ALL="en_US.UTF-8"
 4
Author: Hồ Ngọc Vượng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-25 01:37:23

Poniżej rozwiązanie zadziałało dla mnie, właśnie dodałem

U "String"

(reprezentujący łańcuch znaków jako unicode) przed moim łańcuchem.

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
Author: Aravind Krishnakumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 22:57:25

Właśnie miałem ten problem, a Google mnie tu zaprowadziło, więc żeby dodać do ogólnych rozwiązań tutaj, to mi się udało:

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

Wpadłem na ten pomysł po przeczytaniuprezentacji Neda .

Nie twierdzę jednak, że w pełni rozumiem, dlaczego to działa. Więc jeśli ktoś może edytować tę odpowiedź lub umieścić w komentarzu, aby wyjaśnić, będę wdzięczny.
 2
Author: pepoluan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-12 03:14:47

Zauważyliśmy ten błąd podczas uruchamiania manage.py migrate w Django ze zlokalizowanymi oprawami.

Nasze źródło zawierało deklarację # -*- coding: utf-8 -*-, MySQL było poprawnie skonfigurowane dla utf8, a Ubuntu miało odpowiedni pakiet językowy i wartości w /etc/default/locale.

Problem polegał po prostu na tym, że w kontenerze Django (używamy Dockera) brakowało var LANG env.

Ustawienie LANG na en_US.UTF-8 i ponowne uruchomienie kontenera przed ponownym uruchomieniem migracji rozwiązało problem.

 2
Author: followben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 07:26:07

Wiele odpowiedzi tutaj (na przykład @ agf i @Andbdrew) dotyczyło już najpilniejszych aspektów pytania OP.

Jednak myślę, że jest jeden subtelny, ale ważny aspekt, który został w dużej mierze zignorowany i który ma duże znaczenie dla wszystkich, którzy tak jak ja wylądowali tutaj, próbując zrozumieć kodowanie w Pythonie: Python 2 vs Python 3 Zarządzanie reprezentacją znaków jest szalenie różne . Czuję, że wielki kawałek zamieszania ma związek z ludzie czytający o kodowaniu w Pythonie bez znajomości wersji.

Proponuję wszystkim zainteresowanym zrozumieniem głównej przyczyny problemu OP zacząć od przeczytania Spolsky ' ego Wprowadzenie do reprezentacji znaków i Unicode, a następnie przejść do Batchelder na Unicode w Pythonie 2 i Pythonie 3.

 1
Author: Simón Ramírez Amaya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-03 09:03:49

Staraj się unikać konwersji zmiennej na str(zmienna). Czasami może to spowodować problem.

Prosta wskazówka do uniknięcia:

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

Powyższy przykład rozwiąże również błąd kodowania.

 1
Author: sam ruben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-17 05:48:25

Zalecane rozwiązanie nie zadziałało dla mnie i mogłem żyć z wyrzucaniem wszystkich znaków nie ascii, więc

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

Co pozostawiło mi coś pozbawionego, co nie wyrzuca błędów.

 1
Author: Gulzar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-26 19:34:18

W ogólnym przypadku zapisu tego nieobsługiwane kodowanie string (powiedzmy data_that_causes_this_error) do jakiegoś pliku (np. results.txt), to działa

f = open("results.txt", "w")
  f.write(data_that_causes_this_error.encode('utf-8'))
  f.close()
 1
Author: Pe Dro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-07 11:43:50

Jeśli masz coś takiego jak {[1] } to zrób to w następnej linii, zaraz po inicjalizacji packet_data:

unic = u''
packet_data = unic
 0
Author: Nandan Kulkarni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 09:46:31

Aktualizacja dla Pythona 3.0 i nowszych. Spróbuj w edytorze Pythona:

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

Ustawia domyślne kodowanie lokalne systemu na format UTF-8.

Więcej można przeczytać tutaj w PEP 538 -- wymuszanie legacy C locale do UTF-8 oparte locale.

 0
Author: ZF007,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-12-25 12:42:24

Miałem ten problem, próbując wypisać znaki Unicode do stdout, ale z sys.stdout.write, zamiast drukować(tak, że mogłem obsługiwać wyjście do innego pliku, jak również).

Z własnej dokumentacji BeautifulSoup rozwiązałem to za pomocą biblioteki kodeków:

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
Author: palswim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-27 06:00:28

Ten problem często występuje, gdy projekt django wdraża się przy użyciu Apache. Ponieważ Apache ustawia zmienną środowiskową LANG = C w /etc/sysconfig/httpd. Po prostu otwórz plik i skomentuj (lub zmień na swój flavior) to ustawienie. Lub użyj opcji lang polecenia Wsgid, w tym przypadku będziesz mógł ustawić różne zmienne środowiskowe LANG na różne virtualhosty.

 0
Author: shmakovpn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-14 08:08:53

To zadziała:

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

Wyjście:

>>>bats
 0
Author: Huzefa Usama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-05-14 08:35:52