2009-06-12 9 views
8

Sto usando Python 2.5. Che cosa sta succedendo qui? Che cosa ho frainteso? Come posso ripararlo?Problema UTF-8 in python durante la lettura di caratteri

in.txt:

Stäckövérfløw 

code.py

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
print """Content-Type: text/plain; charset="UTF-8"\n""" 
f = open('in.txt','r') 
for line in f: 
    print line 
    for i in line: 
     print i, 
f.close() 

uscita:

Stäckövérfløw 

S t � � c k � � v � � r f l � � w 

risposta

14
for i in line: 
    print i, 

Quando si legge il file, la stringa si legge in è una stringa di byte. Il ciclo for scorre su un singolo byte alla volta. Ciò causa problemi con una stringa codificata UTF-8, in cui i caratteri non ASCII sono rappresentati da più byte. Se si vuole lavorare con gli oggetti Unicode, dove i personaggi sono i pezzi di base, è necessario utilizzare

import codecs 
f = codecs.open('in', 'r', 'utf8') 

Se sys.stdout non ha già il set di codifica appropriata, potrebbe essere necessario avvolgerla:

sys.stdout = codecs.getwriter('utf8')(sys.stdout) 
+0

grazie, perfetto! – jacob

+3

Il parametro 'r' in 'codecs.open' in realtà significa 'rb' (nessuna conversione '\ n') – jfs

1

Check this out:

# -*- coding: utf-8 -*- 
import pprint 
f = open('unicode.txt','r') 
for line in f: 
    print line 
    pprint.pprint(line) 
    for i in line: 
     print i, 
f.close() 

Si restituisce questo:

StackOverflow
'St \ xc3 \ xa4ck \ xc3 \ xb6v \ xc3 \ xa9rfl \ xc3 \ xb8w'
S t? ? c k? ? v? ? r f l? ? w

Il problema è che il file viene semplicemente letto come una stringa di byte. L'iterazione su di essi divide i caratteri multibyte in valori di byte privi di senso.

+0

Tak per Hjælp hurtig! – jacob

2

Utilizzare invece codecs.open, funziona per me.

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
print """Content-Type: text/plain; charset="UTF-8"\n""" 
f = codecs.open('in','r','utf8') 
for line in f: 
    print line 
    for i in line: 
     print i, 
f.close() 
1
print c, 

Aggiunge un "blank charrecter" e interrompe le sequenze utf-8 corrette in una errata. Quindi questo non avrebbe funzionato a meno che non si scrive un byte signle all'uscita

sys.stdout.write(i) 
0

uno potrebbe voler utilizzare solo

f = open('in.txt','r') 
for line in f: 
    print line 
    for i in line.decode('utf-8'): 
     print i, 
f.close() 
Problemi correlati