De ce este cel mai jos element nu? și de ce nu ar reuși cu "latină-1" codec?
o = "a test of \xe9 char" #I want this to remain a string as this is what I am receiving
v = o.decode("utf-8")
rezultate în:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\encodings\utf_8.py",
line 16, in decode
return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError:
'utf8' codec can't decode byte 0xe9 in position 10: invalid continuation byte
În binar, 0xE9 se pare ca 1110 1001
. Dacă ați citit despre UTF-8 pe Wikipedia, veți vedea că astfel de un octet trebuie să fie urmată de două de formă 10xx xxxx
. Astfel, de exemplu:
>>> b'\xe9\x80\x80'.decode('utf-8')
u'\u9000'
Dar asta e doar cauze mecanice de excepție. În acest caz, aveți un șir de caractere care este aproape sigur codificat în limba latină 1. Puteți vedea cum UTF-8 și latină 1 arata diferit:
>>> u'\xe9'.encode('utf-8')
b'\xc3\xa9'
>>> u'\xe9'.encode('latin-1')
b'\xe9'
(Notă, am'm, folosind un amestec de Python 2 și 3 reprezentare aici. Intrarea este valabil în orice versiune de Python, dar interpretorul Python este puțin probabil să arate de fapt, atât unicode și siruri de caractere octet în acest fel.)
Am avut aceeasi eroare când am încercat să deschid un fișier csv de panda read_csv metodă.
Soluția a fost de a schimba codare a 'latină-1':
pd.read_csv('ml-100k/u.item', sep='|', names=m_cols , encoding='latin-1')
Este invalid UTF-8. Acest caracter este e-acută caracter în ISO-Latin1, care este motivul pentru care reușește cu care codeset.
Dacă tu nu't știu codeset te're primirea siruri de caractere în,'re într-un pic de necazuri. Cel mai bine ar fi dacă un singur codeset (sperăm UTF-8) s-ar fi ales pentru protocol/aplicație și apoi'd respinge doar cei care nu't decoda.
Dacă poți't face asta, ai'll nevoie de euristici.
Pentru UTF-8 este multibyte și nu există nici un char corespunde combinația de \xe9
plus următoarele spațiu.
De ce ar trebui să reușească în ambele utf-8 și latin-1?
Aici cum aceeași propoziție ar trebui să fie în utf-8:
>>> o.decode('latin-1').encode("utf-8")
'a test of \xc3\xa9 char'
În acest caz, am încercat să execute un .py care activ o cale/fișier.sql.
Soluția mea a fost să modifice codificarea fișierului.sql pentru a "UTF-8 fără BOM" și funcționează!
Poti sa o faci cu Notepad++.
voi lăsa o parte din codul meu.
/Cod/
con=psycopg2.connect(host = sys.argv[1], port = sys.argv[2],dbname = sys.argv[3],utilizator = sys.argv[4], parola = sys.argv[5])
cursorul = con.cursor() sqlfile = open(cale, 'r')