Как заменить символы Юникода на символы ascii в Python (приведен скрипт perl)? - PullRequest
21 голосов
/ 23 апреля 2010

Я пытаюсь выучить Python и не могу понять, как перевести следующий скрипт Perl в Python:

#!/usr/bin/perl -w                     

use open qw(:std :utf8);

while(<>) {
  s/\x{00E4}/ae/;
  s/\x{00F6}/oe/;
  s/\x{00FC}/ue/;
  print;
}

Скрипт просто меняет умножение юникода на альтернативный вывод ascii. (Так что полный вывод в ascii.) Буду благодарен за любые подсказки. Спасибо!

Ответы [ 4 ]

40 голосов
/ 24 апреля 2010

Для преобразования в 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'
16 голосов
/ 23 апреля 2010
  • Используйте модуль 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, по умолчанию они являются юникодом, и вам не нужно кодировать его, если он содержит символы не ASCII или даже не латинские символы. Поэтому решение будет выглядеть следующим образом:

line = 'Verhältnismäßigkeit, Möglichkeit'

table = {
         ord('ä'): 'ae',
         ord('ö'): 'oe',
         ord('ü'): 'ue',
         ord('ß'): 'ss',
       }

line.translate(table)

>>> 'Verhaeltnismaessigkeit, Moeglichkeit'
4 голосов
/ 06 мая 2014

Вы можете попробовать 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
3 голосов
/ 15 декабря 2013

Я использую 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')
...