2009-06-12 28 views
8

Estoy usando Python 2.5. ¿Que esta pasando aqui? ¿Qué he entendido mal? ¿Cómo puedo arreglarlo?Problema UTF-8 en python al leer caracteres

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

de salida:

Stäckövérfløw 

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

Respuesta

14
for i in line: 
    print i, 

Cuando se lee el archivo, la cadena que se lee en es una cadena de bytes. El bucle for itera sobre un solo byte a la vez. Esto causa problemas con una cadena codificada en UTF-8, donde los caracteres no ASCII están representados por múltiples bytes. Si quieres trabajar con objetos Unicode, donde los personajes son las piezas básicas, se debe utilizar

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

Si sys.stdout no tiene ya el conjunto de codificación adecuada, es posible que tenga que envolverlo:

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

gracias, perfecto! – jacob

+3

El parámetro 'r' en 'codecs.open' en realidad significa 'rb' (no '\ n' conversión) – jfs

1

mira esto:

# -*- 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() 

Devuelve esto:

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

Lo que pasa es que el archivo solo se está leyendo como una cadena de bytes. Al iterar sobre ellos, se dividen los caracteres multibyte en valores de byte sin sentido.

+0

Tak para Ayuda Entre Hurtig! – jacob

2

Use codecs.open en su lugar, funciona para mí.

#!/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, 

Agrega un "carácter blanco" y divide las secuencias correctas de utf-8 en una incorrecta. Así que esto no funcionaría a menos que escribe un byte signle a la salida

sys.stdout.write(i) 
0

Uno puede querer sólo tiene que utilizar

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