Подтвердить что ты не робот

Заменить специальные символы эквивалентом ASCII

Есть ли какой-либо lib, который может заменить специальные символы на эквиваленты ASCII, например:

"Cześć"

в

"Czesc"

Я могу, конечно, создать карту:

{'ś':'s', 'ć': 'c'}

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

4b9b3361

Ответ 1

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import unicodedata
text = u'Cześć'
print unicodedata.normalize('NFD', text).encode('ascii', 'ignore')

Ответ 2

Вы можете получить большую часть своей работы:

import unicodedata

def strip_accents(text):
    return ''.join(c for c in unicodedata.normalize('NFKD', text) if unicodedata.category(c) != 'Mn')

К сожалению, существуют латинские буквы с акцентом, которые нельзя разложить на букву ASCII + сочетание меток. Вам придется обрабатывать их вручную. К ним относятся:

  • Æ → AE
  • Ð → D
  • Ø → O
  • Þ → TH
  • ß → ss
  • æ → ae
  • ð → d
  • ø → o
  • þ → th
  • Œ → OE
  • œ → oe
  • ƒ → f

Ответ 3

Попробуйте trans. Выглядит очень многообещающе. Поддерживает польский.

Ответ 4

Я сделал это следующим образом:

POLISH_CHARACTERS = {
    50309:'a',50311:'c',50329:'e',50562:'l',50564:'n',50099:'o',50587:'s',50618:'z',50620:'z',
    50308:'A',50310:'C',50328:'E',50561:'L',50563:'N',50067:'O',50586:'S',50617:'Z',50619:'Z',}

def encodePL(text):
    nrmtxt = unicodedata.normalize('NFC',text)
    i = 0
    ret_str = []
    while i < len(nrmtxt):
        if ord(text[i])>128: # non ASCII character
            fbyte = ord(text[i])
            sbyte = ord(text[i+1])
            lkey = (fbyte << 8) + sbyte
            ret_str.append(POLISH_CHARACTERS.get(lkey))
            i = i+1
        else: # pure ASCII character
            ret_str.append(text[i])
        i = i+1
    return ''.join(ret_str)

при выполнении:

encodePL(u'ąćęłńóśźż ĄĆĘŁŃÓŚŹŻ')

он будет производить вывод следующим образом:

u'acelnoszz ACELNOSZZ'

Это отлично работает для меня -; D

Ответ 5

Unicodedata.normalize трюк лучше всего описать как half-assci. Вот надежный подход, который включает карту для букв без декомпозиции. Обратите внимание на дополнительные записи в комментариях.