Как искать и заменить utf-8 специальные символы в Python?

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

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

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

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

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

То, что я в конечном счете хочу сделать, заменить все u-умляуты в файле с '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.)

5
задан Abie 13 January 2010 в 05:58
поделиться

3 ответа

-

Я думаю, что это легче всего и яснее сделать это на более простой способ, используя непосредственно, используя представление Unicode OS 'Ü' лучше, чем Unichr (252).

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

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

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

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

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


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

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

8
ответ дан 18 December 2019 в 06:50
поделиться

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

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

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

repr(str.replace(unichr(252), 'ue'))
9
ответ дан 18 December 2019 в 06:50
поделиться

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

Я не знаю ни о каком языке, где единственное акцентированное латинское письмо является нижним регионом-u-с-умлаут-ака-неинезием, поэтому я добавил код на петлю над таблицей переводов под предположение, что вы Нужно это.

# 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
6
ответ дан 18 December 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: