用等效的ASCII替换特殊字符

2024-09-29 03:29:23 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有任何lib可以将特殊字符替换为ASCII等效字符,例如:

"Cześć"

致:

"Czesc"

我当然可以创建地图:

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

使用一些替换功能。但我不想硬编码所有等价物到我的程序中,如果有一个函数已经这样做了。


Tags: 函数程序功能编码libascii地图字符
3条回答
#!/usr/bin/env python
# -*- coding: utf-8 -*-

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

我是这样做的:

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

你可以通过这样做来获得大部分的方法:

import unicodedata

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

不幸的是,有些重音拉丁字母不能分解成ASCII字母+组合标记。你得手动操作。其中包括:

  • Æ→声发射
  • Ð→D
  • Ø→O
  • Þ→TH
  • ß→不锈钢
  • æ→声发射
  • ð→d
  • ø→o
  • þ→th
  • Œ→运行经验
  • œ→运行经验
  • ƒ→f

相关问题 更多 >