2012-04-02 2 views
3

Я знаю, что есть тонны нитей по этому вопросу, но мне не удалось найти тот, который решает мою проблему.Python, чтобы показать специальные символы

Я пытаюсь напечатать строку, но при ее печати не отображаются специальные символы (например, æ, ø, å, ö и ü). Когда я напечатать строку, используя repr() это то, что я получаю:

u'Von D\xc3\xbc' и u'\xc3\x96berg'

Кто-нибудь знает, как я могу преобразовать это в Von Dü и Öberg? Мне важно, чтобы эти символы не игнорировались, например. myStr.encode("ascii", "ignore").

EDIT

Это код, я использую. Я использую BeautifulSoup для очистки веб-сайта. Содержимое ячейки (<td>) в таблице (<table>) помещается в переменную name. Это переменная, которая содержит специальные символы, которые я не могу распечатать.

web = urllib2.urlopen(url); 
soup = BeautifulSoup(web) 
tables = soup.find_all("table") 
scene_tables = [2, 3, 6, 7, 10] 
scene_index = 0 
# Iterate over the <table>s we want to work with 
for scene_table in scene_tables: 
    i = 0 
    # Iterate over < td> to find time and name 
    for td in tables[scene_table].find_all("td"): 
     if i % 2 == 0: # td contains the time 
      time = remove_whitespace(td.get_text()) 
     else:   # td contains the name 
      name = remove_whitespace(td.get_text()) # This is the variable containing "nonsense" 
      print "%s: %s" % (time, name,) 
     i += 1 
    scene_index += 1 
+0

Ваша консоль установлена ​​в режиме UTF-8? – Fabian

+0

Я использую терминал по умолчанию в Mac OS X и UTF-8 включен. – simonbs

ответ

4

Профилактика лучше, чем лечение. Вам нужно узнать, как создается этот мусор. Измените свой вопрос, чтобы показать код, который его создает, и затем мы можем помочь вам исправить его. Похоже, что кто-то сделал:

your_unicode_string = original_utf8_encoded_bytestring.decode('latin1') 

Исцеление заключается в том, чтобы полностью изменить процесс, а затем декодировать.

correct_unicode_string = your_unicode_string.encode('latin1').decode('utf8') 

Update на основе кода, который вы предоставили, то вероятной причиной является то, что веб-сайт заявляет, что она закодирована в ISO-8859-1 (ака latin1), но в действительности он кодируется в UTF-8. Пожалуйста, обновите свой вопрос, чтобы показать нам URL.

Если вы не можете показать это, прочитайте the BS docs; похоже, что вам нужно будет использовать:

BeautifulSoup(web, from_encoding='utf8') 
+0

Я обновил свой вопрос, чтобы показать код, который я использую. Я использую BeautifulSoup для очистки веб-сайта. Затем содержимое ячейки в таблице выбрасывается в переменную 'name'. Это переменная, которая содержит специальные символы, которые я не могу распечатать. – simonbs

+0

Использование 'name.encode ('latin1'). Decode ('utf8')' решает все мои проблемы. Персонажи выглядят идеально, но вы говорите, что это не правильный способ сделать это? – simonbs

+0

@SimonBS: Перечитайте первое предложение моего ответа. Всегда лучше понять * свою реальную проблему и исправить ее у источника, а не по течению. Это кодирование/декодирование просто отменяет основную проблему. –

3

Поддержка Unicode на многих языках сбивает с толку, поэтому ваша ошибка здесь понятна. Эти строки UTF-8 байт, которые будут работать должным образом, если вы уронили u на фронте:

>>> err = u'\xc3\x96berg' 
>>> print err 
Ã?berg 
>>> x = '\xc3\x96berg' 
>>> print x 
Öberg 
>>> u = x.decode('utf-8') 
>>> u 
u'\xd6berg' 
>>> print u 
Öberg 

Для много дополнительной информации:

http://www.joelonsoftware.com/articles/Unicode.html

http://docs.python.org/howto/unicode.html


Вы действительно должны прочитать эти ссылки и понять, что происходит, прежде чем продолжить. Однако, если вы абсолютно необходимо иметь что-то, что работает сегодня, вы можете использовать этот ужасный хак, что я стесняюсь размещать публично:

def convert_fake_unicode_to_real_unicode(string): 
    return ''.join(map(chr, map(ord, string))).decode('utf-8') 
+0

Когда я печатаю строки без 'repr()', это то, что я получаю: 'Ãberg', но то, что я хотел бы иметь, это' Öberg'. Если я использую 'decode ('utf-8')', я получу 'UnicodeEncodeError'. Если строки UTF-8, не следует ли писать 'Ö' вместо' Ã'? – simonbs

+1

Вы хотите выяснить, как эти переменные должны были иметь тип 'unicode' в первую очередь. На самом деле они UTF-8, закодированные в ascii, поэтому они должны иметь тип 'str'. – alberge

+0

-1 для (1) соединение/карта/chr/map/ord mess (2) «UTF-8, закодированный в ascii» –

1

Содержимое строки не юникода, они UTF-8 кодированный ,

>>> print u'Von D\xc3\xbc' 
Von Dü 
>>> print 'Von D\xc3\xbc' 
Von Dü 

>>> print unicode('Von D\xc3\xbc', 'utf-8') 
Von Dü 
>>> 

Edit:

>>> print '\xc3\x96berg' # no unicode identifier, works as expected because it's an UTF-8 encoded string 
Öberg 
>>> print u'\xc3\x96berg' # has unicode identifier, means print uses the unicode charset now, outputs weird stuff 
Ãberg 

# Look at the differing object types: 
>>> type('\xc3\x96berg') 
<type 'str'> 
>>> type(u'\xc3\x96berg') 
<type 'unicode'> 

>>> '\xc3\x96berg'.decode('utf-8') # this command converts from UTF-8 to unicode, look at the unicode identifier in the output 
u'\xd6berg' 
>>> unicode('\xc3\x96berg', 'utf-8') # this does the same thing 
u'\xd6berg' 
>>> unicode(u'foo bar', 'utf-8') # trying to convert a unicode string to unicode will fail as expected 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: decoding Unicode is not supported 
+0

Когда я печатаю строки без 'repr()', это то, что я получаю: 'Ãberg ', но то, что я хотел бы получить, это' Öberg'. Если строки UTF-8, не следует ли писать 'Ö' вместо' Ã'? Если я использую 'unicode', я получаю следующую ошибку:' TypeError: декодирование Unicode не поддерживается'. – simonbs

+0

Вы по-прежнему используете идентификатор юникода ('u'foo''). Это кодированная строка UTF-8 и с использованием идентификатора юникода, вы говорите, что это unicode, где это не так. Вот почему вы получаете 'Ã' вместо' Ö'. Отбросьте идентификатор, и все будет в порядке. Я уточню свой ответ, чтобы он дал понять. – Fabian

+0

@SimonBS Я обновил свой ответ. Вы все равно должны прочитать эту ссылку: http://docs.python.org/howto/unicode.html – Fabian

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