Я - новичок 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.)
Я думаю, что это легче всего и яснее сделать это на более простой способ, используя непосредственно, используя представление 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 результат такой же)
repr(str)
возвращает цитируемую версию str
, которую при распечатке можно будет ввести обратно как Python, чтобы получить обратно строку. Итак, это строка, которая буквально содержит \xfcber
, а не строка, которая содержит über
.
Вы можете просто использовать str.replace(unichr(252), 'ue')
для замены ü
на ue
.
Если вам нужно получить цитируемую версию результата, хотя я не думаю, что она вам понадобится, вы можете обернуть все выражение в repp
:
repr(str.replace(unichr(252), 'ue'))
Вы можете избежать всего этого источника кодирования 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