Как заменить символы Unicode символами ascii в Python (perl script)?
Я пытаюсь изучить python и не могу понять, как перевести следующий perl script в python:
#!/usr/bin/perl -w
use open qw(:std :utf8);
while(<>) {
s/\x{00E4}/ae/;
s/\x{00F6}/oe/;
s/\x{00FC}/ue/;
print;
}
script просто изменяет unicode umlauts на альтернативный выход ascii. (Итак, полный вывод в ascii.) Я был бы признателен за любые намеки. Благодарю!
Ответы
Ответ 1
- Используйте модуль
fileinput
, чтобы перебрать стандартный ввод или список файлов,
- декодировать строки, которые вы читаете из UTF-8, в объекты unicode
- затем сопоставьте любые символы юникода, которые вы хотите, с помощью метода
translate
translit.py
будет выглядеть так:
#!/usr/bin/env python2.6
# -*- coding: utf-8 -*-
import fileinput
table = {
0xe4: u'ae',
ord(u'ö'): u'oe',
ord(u'ü'): u'ue',
ord(u'ß'): None,
}
for line in fileinput.input():
s = line.decode('utf8')
print s.translate(table),
И вы можете использовать его следующим образом:
$ cat utf8.txt
sömé täßt
sömé täßt
sömé täßt
$ ./translit.py utf8.txt
soemé taet
soemé taet
soemé taet
В случае, если вы используете строки python 3, по умолчанию используется unicode, и вам не нужно его кодировать, если он содержит символы, отличные от ASCII, или даже нелатинские символы. Таким образом, решение будет выглядеть следующим образом:
line = 'Verhältnismäßigkeit, Möglichkeit'
table = {
ord('ä'): 'ae',
ord('ö'): 'oe',
ord('ü'): 'ue',
ord('ß'): 'ss',
}
line.translate(table)
>>> 'Verhaeltnismaessigkeit, Moeglichkeit'
Ответ 2
Для преобразования в ASCII вы можете попробовать ASCII, Dammit или этот рецепт, который сводится к следующему:
>>> title = u"Klüft skräms inför på fédéral électoral große"
>>> import unicodedata
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'
Ответ 3
Я использую translitcodec
>>> import translitcodec
>>> print '\xe4'.decode('latin-1')
ä
>>> print '\xe4'.decode('latin-1').encode('translit/long').encode('ascii')
ae
>>> print '\xe4'.decode('latin-1').encode('translit/short').encode('ascii')
a
Вы можете изменить язык декодирования на все, что вам нужно. Вам может понадобиться простая функция для уменьшения длины одной реализации.
def fancy2ascii(s):
return s.decode('latin-1').encode('translit/long').encode('ascii')
Ответ 4
Вы можете попробовать unidecode
для преобразования Unicode в ascii вместо написания ручных регулярных выражений. Это порт Python модуля Text::Unidecode
Perl:
#!/usr/bin/env python
import fileinput
import locale
from contextlib import closing
from unidecode import unidecode # $ pip install unidecode
def toascii(files=None, encoding=None, bufsize=-1):
if encoding is None:
encoding = locale.getpreferredencoding(False)
with closing(fileinput.FileInput(files=files, bufsize=bufsize)) as file:
for line in file:
print unidecode(line.decode(encoding)),
if __name__ == "__main__":
import sys
toascii(encoding=sys.argv.pop(1) if len(sys.argv) > 1 else None)
Он использует класс FileInput
, чтобы избежать глобального состояния.
Пример:
$ echo 'äöüß' | python toascii.py utf-8
aouss