Mam kilka problemów, próbując zakodować ciąg do UTF-8. Próbowałem wielu rzeczy, w tym używania string.encode('utf-8')
i unicode(string)
, ale pojawia się błąd:
UnicodeDecodeError: kodek „ascii” nie może zdekodować bajtu 0xef na pozycji 1: numer porządkowy poza zakresem (128)
To jest mój ciąg:
(。・ω・。)ノ
Nie rozumiem, co się dzieje, jakiś pomysł?
Edycja: Problem polega na tym, że drukowanie ciągu w takiej postaci, w jakiej jest, nie jest wyświetlane poprawnie. Również ten błąd, gdy próbuję go przekonwertować:
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53)
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> s = '(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
>>> s1 = s.decode('utf-8')
>>> print s1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-5: ordinal not in range(128)
Odpowiedzi:
Ma to związek z tym, że kodowanie twojego terminala nie jest ustawione na UTF-8. Oto mój terminal
Na moim terminalu przykład działa z powyższym, ale jeśli pozbędę się tego
LANG
ustawienia, to nie zadziałaZapoznaj się z dokumentacją dotyczącą wersji systemu Linux, aby dowiedzieć się, jak wprowadzić tę zmianę na stałe.
źródło
sudo apt-get install language-pack-de
lubsudo locale-gen de_DE.UTF-8
(dla języków niemieckich).LC_ALL
, a najprostszą wartością, która by to naprawić, jestC.UTF-8
próbować:
edytować:
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'.decode('utf-8')
dajeu'(\uff61\uff65\u03c9\uff65\uff61)\uff89'
, co jest poprawne.więc twój problem musi być w innym miejscu, być może jeśli spróbujesz coś z nim zrobić, gdy zachodzi niejawna konwersja (może to być drukowanie, zapisywanie do strumienia ...)
aby powiedzieć więcej, musimy zobaczyć kod.
źródło
UnicodeEncodeError: 'charmap' codec can't encode characters in position 1-5: character maps to <undefined>
'(\xef\xbd\xa1\xef\xbd\xa5\xcf\x89\xef\xbd\xa5\xef\xbd\xa1)\xef\xbe\x89'
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
.string
jest utf8 kodowane. jeśli go wydrukujesz, po prostu zapisuje bajty do strumienia wyjściowego, a jeśli twój terminal nie zinterpretuje go jako utf8, skończysz ze śmieciami. zdecode
przekonwertować go na Unicode, a następnie możnaencode
go ponownie do kodowania terminal rozumie.Moje +1 do komentarza maty na https://stackoverflow.com/a/10561979/1346705 oraz do demonstracji Nicka Craiga-Wooda. Odszyfrowałeś poprawnie ciąg. Problem polega na tym, że
print
polecenie konwertuje ciąg Unicode na kodowanie konsoli, a konsola nie jest w stanie wyświetlić ciągu. Spróbuj zapisać ciąg do pliku i spójrz na wynik za pomocą przyzwoitego edytora obsługującego Unicode:Wtedy zobaczysz
(。・ω・。)ノ
.źródło
Jeśli pracujesz na zdalnym hoście, spójrz
/etc/ssh/ssh_config
na swój lokalny komputer.Gdy ten plik zawiera wiersz:
skomentuj to, dodając
#
na początku wiersza. To może pomóc.Za pomocą tej linii
ssh
wysyła zmienne środowiskowe związane z językiem komputera do zdalnego hosta. Powoduje wiele problemów.źródło
Spróbuj ustawić domyślne kodowanie systemowe
utf-8
na początku skryptu, tak aby wszystkie ciągi znaków były kodowane za pomocą tego.źródło
Możesz użyć poniższego kodu w górnej części skryptu, jak zasugerował Andrei Krasutski .
Ale proponuję również dodanie
# -*- coding: utf-8 -*
linii na samej górze skryptu.Pominięcie tego powoduje wyświetlenie poniższego błędu w moim przypadku, gdy próbuję wykonać
basic.py
.Poniżej znajduje się kod, w
basic.py
którym wyrzuca powyższy błąd.kod z błędem
Następnie dodałem
# -*- coding: utf-8 -*-
linię na samej górze i wykonałem . Zadziałało.kod bez błędu
Dzięki.
źródło
#coding: utf-8
zamiast# -*- coding: utf-8 -*-
tego jest łatwiejsze do zapamiętania. Działa po wyjęciu z pudełka z Python PEP 263 - Definiowanie kodowania kodu źródłowego w języku Python .Żadnych problemów z moim terminalem. Powyższe odpowiedzi pomogły mi spojrzeć we właściwych kierunkach, ale nie zadziałały, dopóki nie dodałem
'ignore'
:Jak wskazano w poniższym komentarzu, może to prowadzić do niepożądanych rezultatów. OTOH może też po prostu wykonać tę sztuczkę wystarczająco dobrze, aby wszystko działało i nie przejmujesz się utratą niektórych postaci.
źródło
to działa dla ubuntu 15.10:
źródło
Wygląda na to, że Twój ciąg jest zakodowany
utf-8
, więc na czym dokładnie polega problem? Albo co próbujesz tutaj zrobić ..?źródło
(´¢í´¢Ñ¤ë´¢Ñ´¢í)´¥ë
, chcę, aby był poprawnie zakodowany.W moim przypadku było to spowodowane zapisywaniem mojego pliku Unicode z "BOM". Aby rozwiązać ten problem, otworzyłem plik używając BBEdit i zrobiłem "Zapisz jako ..." wybierając do kodowania "Unicode (UTF-8)", a nie to, z czym przyszedł, czyli "Unicode (UTF-8, z BOM) "
źródło
Otrzymałem ten sam typ błędu i stwierdziłem, że konsola nie jest w stanie wyświetlić ciągu w innym języku. Dlatego dokonałem poniższych zmian w kodzie, aby ustawić default_charset jako UTF-8.
źródło
To najlepsza odpowiedź: https://stackoverflow.com/a/4027726/2159089
w systemie Linux:
więc
sys.stdout.encoding
jest OK.źródło
BOM, tak często jest dla mnie BOM
vi plik, użyj
i zapisz to. To prawie zawsze rozwiązuje problem w moim przypadku
źródło
Miałem ten sam błąd, z adresami URL zawierającymi znaki inne niż ASCII (bajty o wartościach> 128)
Pracowałem dla mnie, w Pythonie 2.7, przypuszczam, że to przypisanie zmieniło `` coś '' w
str
wewnętrznej reprezentacji - tj. Wymusza prawidłowe dekodowanie sekwencji bajtów z zabezpieczeniemurl
i ostatecznie umieszcza łańcuch w utf-8str
z całą magią w dobre miejsce. Unicode w Pythonie to dla mnie czarna magia. Mam nadzieję, że przydatneźródło
rozwiązuję ten problem zmieniając w pliku settings.py 'ENGINE': 'django.db.backends.mysql', nie używam 'ENGINE': 'mysql.connector.django',
źródło
Po prostu przekonwertuj tekst jawnie na ciąg przy użyciu
str()
. Pracował dla mnie.źródło