Как искать и заменять специальные символы utf-8 в Python? - PullRequest
5 голосов
/ 13 января 2010

Я новичок в Python, и у меня проблема с utf-8.

У меня есть строка utf-8, и я хотел бы заменить все немецкие умлауты на замены ASCII (на немецком языке u-умлаут «ü» можно переписать как «и»)

u-umlaut имеет кодовую точку Unicode 252, поэтому я попробовал это:

>>> str = unichr(252) + 'ber'
>>> print repr(str)
u'\xfcber'
>>> print repr(str).replace(unichr(252), 'ue')
u'\xfcber'

Я ожидал, что последняя строка будет u'ueber'.

В конечном итоге я хочу заменить все u-umlauts в файле на 'ue':

import sys
import codecs      
f = codecs.open(sys.argv[1],encoding='utf-8')
for line in f: 
    print repr(line).replace(unichr(252), 'ue')

Спасибо за вашу помощь! (Я использую Python 2.3.)

Ответы [ 3 ]

9 голосов
/ 13 января 2010

repr(str) возвращает цитированную версию str, которая при распечатке будет тем, что вы можете напечатать обратно как Python, чтобы получить строку обратно. Таким образом, это строка, которая буквально содержит \xfcber вместо строки, содержащей über.

Вы можете просто использовать str.replace(unichr(252), 'ue'), чтобы заменить ü на ue.

Если вам нужно получить процитированную версию результата этого, хотя я не думаю, что вам это нужно, вы можете заключить все выражение в repr:

repr(str.replace(unichr(252), 'ue'))
8 голосов
/ 13 января 2010

Я думаю, что проще и понятнее сделать это более простым способом, используя непосредственное представление в юникоде os 'ü' лучше, чем unichr (252).

>>> s = u'über'
>>> s.replace(u'ü', 'ue')
u'ueber'

Нет необходимости использовать repr, так как это выведет «представление Python» строки, вам просто нужно представить читаемую строку.

Вам также необходимо включить следующую строку в начале файла .py, если он еще не существует, чтобы сообщить кодировку файла

#-*- coding: UTF-8 -*-

Добавлено: Конечно, заявленная кодировка должна совпадать с кодировкой файла. Пожалуйста, проверьте это, поскольку могут быть некоторые проблемы (у меня были проблемы с Eclipse в Windows, например, так как он записывает файлы по умолчанию как cp1252. Также это должна быть та же самая кодировка системы, которая может быть utf-8, или латинская -1 или др.


Кроме того, не используйте str в качестве определения переменной, так как она является частью библиотеки Python. У вас могут возникнуть проблемы позже.

(я пытаюсь на Python 2.6, я думаю, в Python 2.3 результат тот же)

6 голосов
/ 13 января 2010

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

Я не знаю ни одного языка, где единственная акцентированная латинская буква - это строчные буквы "u-with-umlaut-aka-diaeresis", поэтому я добавил код для циклического перебора таблицы переводов в предположении, что вы понадобится.

# coding: ascii

translations = (
    (u'\N{LATIN SMALL LETTER U WITH DIAERESIS}', u'ue'),
    (u'\N{LATIN SMALL LETTER O WITH DIAERESIS}', u'oe'),
    # et cetera
    )

test = u'M\N{LATIN SMALL LETTER O WITH DIAERESIS}ller von M\N{LATIN SMALL LETTER U WITH DIAERESIS}nchen'

out = test
for from_str, to_str in translations:
    out = out.replace(from_str, to_str)
print out

вывод:

Moeller von Muenchen
...