Python UnicodeDecodeError - czy źle zrozumiałem kodowanie?

Jakieś pomysły, dlaczego to nie działa? Naprawdę myślałem, że "ignoruj" zrobi dobrą rzecz.

>>> 'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
Traceback (most recent call last):
  File "<interactive input>", line 1, in ?
UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 4: ordinal not in range(128)
Author: Greg, 2008-12-15

5 answers

...nie bez powodu nazywa się je "kodowaniem" ...

Mała preambuła: pomyśl o unicode jako o normie lub stanie idealnym. Unicode jest tylko tabelą znaków. №65 to łacińska stolica A. №937 to grecka stolica omega. Tylko to.

Aby komputer mógł przechowywać i-lub manipulować Unicode, musizakodować do bajtów. Najprostszym kodowaniem W Unicode jest UCS-4; każdy znak zajmuje 4 bajty, a wszystkie ~1000000 znaków są dostępne. The 4 bajty zawierają Numer znaku w tabelach Unicode jako 4-bajtową liczbę całkowitą. Innym bardzo użytecznym kodowaniem jest UTF-8, które może kodować dowolny znak Unicode z jednym do czterech bajtów. Ale istnieją również pewne ograniczone kodowania, takie jak "latin1", które zawierają bardzo ograniczony zakres znaków, używany głównie przez kraje zachodnie. Takie kodowanie używa tylko jednego bajtu na znak.

Zasadniczo Unicode może być zakodowany {[8] } z wieloma kodowaniami, a zakodowane ciągi mogą być decoded to Unicode. Rzecz w tym, że Unicode pojawił się dość późno, więc wszyscy, którzy dorastaliśmy używając 8-bitowego zestawu znaków dowiedzieli się zbyt późno, że cały ten czas pracowaliśmy z zakodowanymi ciągami znaków. Kodowanie może być ISO8859 - 1, lub Windows CP437, lub CP850, lub, Lub, lub, w zależności od domyślnego systemu.

Więc kiedy w kodzie źródłowym wpisujesz ciąg "dodaj " Monitoring" do listy "(i myślę, że chciałeś ciąg "dodaj" Monitoring "do listy", zwróć uwagę na drugi cytat), w rzeczywistości używasz już zakodowanego zgodnie z domyślną stroną kodową systemu (przez bajt \x93 zakładam, że używasz strony kodowej Windows 1252, "Western"). Jeśli chcesz uzyskać z tego Unicode, musisz dekodować ciąg znaków z kodowania "cp1252".

Więc, co chciałeś zrobić, było:

"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")
Szkoda, że Python 2.x zawiera metodę .encode również dla łańcuchów; jest to Funkcja wygodna dla" specjalnych "kodowań, takich jak" zip " lub "rot13" lub "base64", które nie mają nic wspólnego z Unicode.

W każdym razie, wszystko co musisz pamiętać do konwersji Unicode to:

  • ciąg znaków Unicode otrzymuje zakodowany do Pythona 2.x string (właściwie sekwencja bajtów)
  • Pyton 2.x string gets decoded to a Unicode string

W obu przypadkach należy określić kodowanie , które będzie używane.

Nie jestem zbyt jasny, jestem śpiący, ale mam nadzieję, że pomocy.

PS humorystyczna Uwaga: Majowie nie mieli Unicode; starożytni Rzymianie, starożytni Grecy, starożytni Egipcjanie też nie. Wszyscy oni mieli swoje własne "kodowania" i nie mieli zbyt wiele szacunku dla innych kultur. Wszystkie te cywilizacje rozpadły się w proch. Pomyślcie o tym ludzie! Uczyń swoje aplikacje świadomymi Unicode, dla dobra ludzkości. :)

PS2 proszę nie psuj poprzedniej wiadomości mówiąc " ale Chińczycy...". Jeśli jednak czujesz się do tego skłonny lub zobowiązany, opóźnij to myśląc że Unicode BMP jest wypełniony głównie przez chińskich ideogramów, Ergo Chiński jest podstawą Unicode. Mogę dalej wymyślać skandaliczne kłamstwa, tak długo, jak ludzie rozwijają aplikacje oparte na Unicode. Zdrowie!

 204
Author: tzot,
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-06-27 12:13:49

Kodowanie jest dostępne dla ciągów unicode, ale ciąg, który tam masz, nie wydaje się unicode (spróbuj użyć u 'add \x93Monitoring\x93 do listy')

>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '
 3
Author: Roberto Liffredo,
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
2008-12-15 16:02:02

Napisałem też długi blog na ten temat:

Problemy z Unicode i Getting on with It

 0
Author: Gregg Lind,
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
2009-01-08 19:20:32

Występuje ten sam problem; jednak problemy ze zrozumieniem, jak prawidłowo włączyć składnię kodowania bez generowania większej liczby błędów lub nieprawidłowego błędu składni.

 genesis_block = {
    'hash': hash_function({
        'block_number': 0,
        'parent_hash': None,
        'transaction_count': 1,
        'transaction': [{'Tom': 10}]
    }),
    'contents': {
        'block_number': 0,
        'parent_hash': None,
        'transaction_count': 1,
        'transaction': [{'Tom': 10}]
    },
}

block_chain = [genesis_block]
chain_state = {'Tom': 10}
 -1
Author: SoulofValerius,
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-16 00:19:53

To chyba działa:

'add \x93Monitoring\x93 to list '.decode('latin-1').encode('latin-1')
Jakieś problemy z tym? Zastanawiam się, kiedy 'ignore', 'replace' i inne takie kodowanie obsługi błędów przychodzi?
 -2
Author: Greg,
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
2008-12-15 16:10:11