2015-03-27 2 views
-1

Я читаю файл с кодировкой utf-8. Когда я печатаю текст напрямую, все в порядке. Когда я печатаю текст из класса с помощью msg.__str__(), он тоже работает. Но я действительно не знаю, как печатать его только с str(msg), потому что это всегда приведет к ошибке «кодек ascii не может кодировать символ u '\ xe4' в позиции 10: порядковый номер не в диапазоне (128)" если в тексте есть умляут.UnicodeEncodeError только с str (текст) в Python

Пример кода:

#!/usr/bin/env python 
# encoding: utf-8 

import codecs from TempClass import TempClass 

file = codecs.open("person.txt", encoding="utf-8") message = 
file.read() #I am Mr. Händler. 

#works 
print message 

msg = TempClass(message) 
#works 
print msg.__str__() 
#works 
print msg.get_string() 

#error 
print str(msg) 

А класс:

class TempClass(object): 

def __init__(self, text): 
    self.text = text 

def get_string(self): 
    return self.text 

def __str__(self): 
    return self.text 

Я пытался кодировать и декодировать текст несколькими способами, но ничего не работает для меня.

Помощь? :)

Edit: Я использую Python 2.7.9

+0

Зачем вы хотите это сделать? 'print u '\ xe4' -> ä ' –

+0

Зачем вам нужно использовать 'str (msg)'? 'msg' уже является строкой. Я также не могу воспроизвести проблему (Python 3.4.2). – TigerhawkT3

+1

@ TigerhawkT3, OP использует python2, который очень отличается от python3, также тип unicode не str –

ответ

1

Поскольку messagemsg.text) не str но unicode объекты. Для вызова str() вам нужно снова указать utf-8 в качестве кодировки. Ваш метод __str__ должен выглядеть следующим образом:

def __str__(self): 
    return self.text.encode('utf-8') 

unicode может быть неявно закодированы str, если он содержит только символы ASCII, поэтому вы видите только ошибку, когда вход содержит умляут.

+0

Когда я его изменяю, умляуты не будут напечатаны. Они будут напечатаны, если я также изменил строку печати на 'str (msg) .decode ('utf-8')'. Это странный путь. –

+0

Это сработало для меня, но моя терминальная кодировка - UTF-8. Может быть, у вас нет? Ваш дополнительный '.decode ('utf-8')' преобразует его обратно в 'unicode', который затем будет правильно закодирован для вашего терминала. Есть ли причина не использовать 'unicode' (или Python 3)? 'str' ==' bytes' в Python 3, что означает, что если вы используете его для текста, вы подразумеваете ASCII-кодирование (которое прерывается, если у вас есть текст без ASCII). – rezca

Смежные вопросы