Na minha resposta original, também sugeri unicodedata.normalize
. No entanto, decidi testá-lo e descobri que não funciona com aspas Unicode. Ele faz um bom trabalho na tradução de caracteres Unicode acentuados, então suponho que unicodedata.normalize
seja implementado usando a unicode.decomposition
função, o que me leva a acreditar que provavelmente só pode lidar com caracteres Unicode que são combinações de uma letra e uma marca diacrítica, mas não estou um especialista na especificação Unicode, então eu poderia estar cheio de ar quente ...
Em qualquer caso, você pode usar unicode.translate
para lidar com caracteres de pontuação. O translate
método usa um dicionário de ordinais Unicode para ordinais Unicode, portanto, você pode criar um mapeamento que converte a pontuação somente Unicode em pontuação compatível com ASCII:
'Maps left and right single and double quotation marks'
'into ASCII single and double quotation marks'
>>> punctuation = { 0x2018:0x27, 0x2019:0x27, 0x201C:0x22, 0x201D:0x22 }
>>> teststring = u'\u201Chello, world!\u201D'
>>> teststring.translate(punctuation).encode('ascii', 'ignore')
'"hello, world!"'
Você pode adicionar mais mapeamentos de pontuação, se necessário, mas não acho que você necessariamente precise se preocupar em lidar com cada caractere de pontuação Unicode. Se você não precisa acentos punho e outros sinais diacríticos, você ainda pode usar unicodedata.normalize
para lidar com esses caracteres.