type - python unicode to ascii




Python UnicodeDecodeError-Mi capita di non capire la codifica? (4)

Qualche idea sul perché questo non funziona? Pensavo davvero che "ignorare" avrebbe fatto la cosa giusta.

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

... c'è un motivo per cui si chiamano "codifiche" ...

Un piccolo preambolo: pensare all'unicode come alla norma, o allo stato ideale. Unicode è solo una tabella di caratteri. №65 è la capitale latina A. №937 è la capitale greca omega. Solo quello.

Affinché un computer possa archiviare e manipolare Unicode, deve codificarlo in byte. La codifica più semplice di Unicode è UCS-4; ogni personaggio occupa 4 byte e tutti i ~ 1000000 caratteri sono disponibili. I 4 byte contengono il numero del carattere nelle tabelle Unicode come un intero a 4 byte. Un'altra codifica molto utile è UTF-8, che può codificare qualsiasi carattere Unicode da uno a quattro byte. Ma ci sono anche alcune codifiche limitate, come "latin1", che includono una gamma di caratteri molto limitata, utilizzata principalmente dai paesi occidentali. Tali codifiche utilizzano solo un byte per carattere.

Fondamentalmente, Unicode può essere codificato con molte codifiche e le stringhe codificate possono essere decodificate in Unicode. Il fatto è che Unicode è arrivato abbastanza tardi, quindi tutti noi che siamo cresciuti usando un set di caratteri a 8 bit abbiamo imparato troppo tardi che per tutto questo tempo abbiamo lavorato con stringhe codificate . La codifica potrebbe essere ISO8859-1 o Windows CP437 o CP850, o, o, o, in base al nostro sistema predefinito.

Quindi, quando, nel tuo codice sorgente, inserisci la stringa "aggiungi" Monitoraggio "alla lista" (e penso che volevi la stringa "aggiungi" Monitoraggio "alla lista", nota la seconda citazione), in realtà stai usando una stringa già codificato secondo la codepage predefinita del tuo sistema (dal byte \ x93 presumo tu usi la codepage 1252 di Windows, "Western"). Se si desidera ottenere Unicode da questo, è necessario decodificare la stringa dalla codifica "cp1252".

Quindi, quello che volevi fare era:

"add \x93Monitoring\x94 to list".decode("cp1252", "ignore")

È sfortunato che Python 2.x includa anche un metodo .encode per le stringhe; questa è una funzione utile per codifiche "speciali", come quelle "zip" o "rot13" o "base64", che non hanno nulla a che fare con Unicode.

In ogni caso, tutto ciò che devi ricordare per le tue conversioni Unicode "va e vieni" è:

  • una stringa Unicode viene codificata in una stringa 2.x Python (in realtà, una sequenza di byte)
  • una stringa Python 2.x viene decodificata in una stringa Unicode

In entrambi i casi, è necessario specificare la codifica che verrà utilizzata.

Non sono molto chiaro, ho sonno, ma spero davvero di aiutarti.

PS Una nota umoristica: i Maya non avevano Unicode; antichi romani, antichi greci, antichi egizi non lo facevano. Tutti avevano le loro "codifiche" e avevano poco o nessun rispetto per le altre culture. Tutte queste civiltà si sono sbriciolate in polvere. Pensaci persone! Rendi le tue app compatibili con Unicode, per il bene dell'umanità. :)

PS2 Si prega di non rovinare il messaggio precedente dicendo "Ma il cinese ...". Se ti senti incline o obbligato a farlo, però, rimandalo pensando che il BMP Unicode sia popolato principalmente da ideogrammi cinesi, ergo Chinese è la base di Unicode. Posso continuare a inventare menzogne ​​oltraggiose, a patto che le persone sviluppino applicazioni compatibili con Unicode. Saluti!



Sperimentare lo stesso problema; tuttavia, avendo difficoltà a comprendere come comprendere in modo appropriato la sintassi di codifica senza generare più errori o un errore di sintassi non valido.

 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}

la codifica è disponibile per le stringhe unicode, ma la stringa che hai lì non sembra unicode (prova con u'add \ x93Monitoring \ x93 per elencare ')

>>> u'add \x93Monitoring\x93 to list '.encode('latin-1','ignore')
'add \x93Monitoring\x93 to list '




ignore