2010-07-07 30 views
20

C'è qualche lib che può sostituire i caratteri speciali per gli equivalenti ASCII, come:Sostituire i caratteri speciali con ASCII equivalente

"Cześć" 

a:

"Czesc" 

posso ovviamente creare mappa:

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

e utilizzare alcune funzioni di sostituzione. Ma non voglio hardcode tutti gli equivalenti nel mio programma, se c'è qualche funzione che già lo fa.

+0

possibile duplicato di [Codifica semplice ASCII ASCII con python] (http://stackoverflow.com/questions/3114176/simple-ascii-url-encoding-with-python) – miku

+0

possibile duplicato: http://stackoverflow.com/questions/1382998/latin-1-to- ascii –

+0

cerca 'Unihandecode' – n611x007

risposta

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

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

'NFKD' ti darebbe l'output ASCII più spesso di quanto farebbe 'NFD'. – dan04

+2

non funziona per tutti i casi, ad esempio '(VW Polo) - Zapłon Jak sprawdzić ciao działa pompa wspomagania?' convertiti in ' (VW Polo) - Zapon jak sprawdzic ciao dziaa pompa wspomagania? ' –

14

È possibile ottenere maggior parte della strada facendo:

import unicodedata 

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

Purtroppo, esistono accentate lettere latine, che non può essere scomposto in una lettera ASCII + marchi conciliano. Dovrai gestirli manualmente. Questi includono:

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

L'espediente unicodedata.normalize può essere descritta come mezzo assci. Ecco uno robust approach che include una mappa per lettere senza decomposizione. Nota le voci della mappa aggiuntive nei commenti.

3

Provare il pacchetto trans. Sembra molto promettente. Supporta polacco.

+0

Questo è stato perfetto per me, ed è con licenza BSD. – UltraNurd

2

ho fatto in questo modo:

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) 

quando eseguito:

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

produrrà output come questo:

u'acelnoszz ACELNOSZZ' 

Questo funziona bene per me -; D

Problemi correlati