2010-07-07 8 views
20

Gibt es eine lib, die Sonderzeichen in ASCII-Äquivalente ersetzen können, wie:Ersetzen von Sonderzeichen mit ASCII-Äquivalent

"Cześć" 

zu:

"Czesc" 

ich natürlich kann Karte erstellen:

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

und verwenden Sie einige ersetzen Funktion. Aber ich möchte nicht alle Äquivalente in mein Programm schreiben, wenn es eine Funktion gibt, die das schon tut.

+0

mögliches Duplikat von [Simple ascii url encoding mit python] (http://stackoverflow.com/questions/3114176/simple-ascii-url-encoding-with-python) – miku

+0

möglich duplizieren: http://stackoverflow.com/questions/1382998/latin-1-to- ascii –

+0

Suchen Sie nach 'Unihandecode' – n611x007

Antwort

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

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

'NFKD' würde Sie ASCII-Ausgabe häufiger geben als 'NFD' würde. – dan04

+2

es funktioniert nicht für alle Fälle, d. H. '(VW Polo) - Zapłon Jak sprawdzić czy działa pompa wspomagania?' konvertiert zu ' (VW Polo) - Zapon jak sprawdzic czy dziaa pompa wspomagania? ' –

14

Sie können die meisten aus dem Weg, indem Sie:

import unicodedata 

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

Leider gibt es lateinische Buchstaben mit Akzenten, die die Kombination von Markierungen + kann nicht in eine ASCII-Buchstaben zerlegt werden. Sie müssen sie manuell behandeln. Dazu gehören:

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

Die unicodedata.normalize Gimmick kann am besten als Halb assci beschrieben. Hier ist eine robust approach, die eine Karte für Buchstaben ohne Dekomposition enthält. Notieren Sie die zusätzlichen Karteneinträge in den Kommentaren.

3

Versuchen Sie das trans Paket. Sieht sehr vielversprechend aus. Unterstützt Polnisch.

+0

Das war perfekt für mich, und es ist BSD-lizenziert. – UltraNurd

2

Ich habe es auf diese Weise:

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) 

wenn sie ausgeführt werden:

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

es Ausgabe wie folgt produzieren:

u'acelnoszz ACELNOSZZ' 

Dies funktioniert gut für mich -; D