Ti sei imbattuto nel problema generale delle codifiche: come posso sapere in quale codifica si trova un file?
Risposta: non è possibile a meno che il formato del file non preveda questo. XML, ad esempio, inizia con:
<?xml encoding="utf-8"?>
Questa intestazione è stata scelta con cura in modo che possa essere letta indipendentemente dalla codifica. Nel tuo caso, non esiste un tale suggerimento, quindi né il tuo editor né Python hanno idea di cosa stia succedendo. Pertanto, è necessario utilizzare il codecs
modulo e utilizzarecodecs.open(path,mode,encoding)
che fornisce il bit mancante in Python.
Per quanto riguarda l'editor, è necessario verificare se offre un modo per impostare la codifica di un file.
Il punto di UTF-8 è di essere in grado di codificare i caratteri a 21 bit (Unicode) come un flusso di dati a 8 bit (perché questa è l'unica cosa che tutti i computer al mondo sono in grado di gestire). Ma poiché la maggior parte dei sistemi operativi è precedente all'era Unicode, non dispongono di strumenti adeguati per collegare le informazioni di codifica ai file sul disco rigido.
Il prossimo numero è la rappresentazione in Python. Questo è spiegato perfettamente nel commento di Heikogerlach . Devi capire che la tua console può visualizzare solo ASCII. Per visualizzare Unicode o altro> = charcode 128, è necessario utilizzare alcuni metodi di escape. Nel tuo editor, non devi digitare la stringa di visualizzazione con escape ma cosa significa la stringa (in questo caso, devi inserire la umlaut e salvare il file).
Detto questo, puoi usare la funzione Python eval () per trasformare una stringa con escape in una stringa:
>>> x = eval("'Capit\\xc3\\xa1n\\n'")
>>> x
'Capit\xc3\xa1n\n'
>>> x[5]
'\xc3'
>>> len(x[5])
1
Come puoi vedere, la stringa "\ xc3" è stata trasformata in un singolo carattere. Questa è ora una stringa a 8 bit, codificata UTF-8. Per ottenere Unicode:
>>> x.decode('utf-8')
u'Capit\xe1n\n'
Gregg Lind ha chiesto: Penso che manchino alcuni pezzi: il file f2 contiene: hex:
0000000: 4361 7069 745c 7863 335c 7861 316e Capit\xc3\xa1n
codecs.open('f2','rb', 'utf-8')
, ad esempio, li legge tutti in caratteri separati (previsti) Esiste un modo per scrivere su un file in ASCII che funzioni?
Risposta: dipende da cosa intendi. ASCII non può rappresentare caratteri> 127. Quindi hai bisogno di un modo per dire "i prossimi caratteri significano qualcosa di speciale" che è ciò che fa la sequenza "\ x". Dice: I prossimi due caratteri sono il codice di un singolo carattere. "\ u" fa lo stesso usando quattro caratteri per codificare Unicode fino a 0xFFFF (65535).
Quindi non puoi scrivere direttamente Unicode su ASCII (perché ASCII semplicemente non contiene gli stessi caratteri). Puoi scriverlo come escape di stringa (come in f2); in questo caso, il file può essere rappresentato come ASCII. Oppure puoi scriverlo come UTF-8, nel qual caso hai bisogno di un flusso sicuro a 8 bit.
La soluzione utilizzata decode('string-escape')
funziona, ma è necessario essere consapevoli della quantità di memoria utilizzata: tre volte la quantità di utilizzocodecs.open()
.
Ricorda che un file è solo una sequenza di byte con 8 bit. Né i bit né i byte hanno un significato. Sei tu che dici "65 significa 'A'". Dato che \xc3\xa1
dovrebbe diventare "à" ma il computer non ha alcun mezzo per saperlo, devi dirlo specificando la codifica che è stata utilizzata durante la scrittura del file.