2010-07-07 34 views
20

替換特殊字符,是否有可以替代的特殊字符的ASCII等價物,像任何LIB:與ASCII相當於

"Cześć" 

到:

"Czesc" 

我當然可以創建地圖:

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

並使用一些替換功能。但是我不想將所有的等價物硬編碼到我的程序中,如果有一些功能已經這樣做的話。

+0

可能的重複[Simple ascii url encoding與蟒蛇](http://stackoverflow.com/questions/3114176/simple-ascii-url-encoding-with-python) – miku 2010-07-07 12:16:32

+0

可能的重複:http://stackoverflow.com/questions/1382998/latin-1-to- ascii – 2010-07-07 13:16:11

+0

尋找'Unihandecode' – n611x007 2015-06-04 17:01:18

回答

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

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

'NFKD'會給你比'NFD'更頻繁的ASCII輸出。 – dan04 2010-07-12 06:11:37

+2

它不適用於所有情況,即'(大衆波羅) - ZapłonJaksprawdzićczydziałapompa wspomagania?' 轉換爲 '(大衆波羅) - Zapon jak sprawdzic czy dziaa pompa wspomagania?' – 2015-04-30 15:46:30

14

您可以通過執行獲得大多數的方式:即不能被分解成ASCII字母+組合標記

import unicodedata 

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

不幸的是,存在重音拉丁字母。你必須手動處理它們。這些包括:

  • Æ→AE
  • d→d
  • Ø→O;
  • Þ→TH
  • ß→SS
  • æ→AE
  • d→d
  • ø→ö
  • þ→th
  • Œ→OE
  • œ→OE
  • ƒ→˚F
1

的unicodedata.normalize手法可以最好被描述爲半assci。這裏有一個robust approach,其中包括一個沒有分解的字母映射。注意註釋中的附加映射條目。

3

嘗試trans包。看起來很有希望。支持波蘭語。

+0

這對我來說是完美的,它是BSD許可的。 – UltraNurd 2012-06-11 04:32:36

2

我就是這麼做的:

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