Pergunta

Eu tenho algum texto que usa Unicode pontuação, como aspas duplas esquerda, aspas simples certa para apóstrofe, e assim por diante, e eu preciso dele em ASCII. Python tem um banco de dados desses personagens com substitutos ASCII óbvias para que eu possa fazer melhor do que transformá-los todos em "?" ?

Foi útil?

Solução

Unidecode olhares como uma solução completa. Ele converte citações extravagantes para aspas ASCII, caracteres acentuados Latina a tentativas não acentuadas e até mesmo transliteração para lidar com personagens que não têm equivalentes ASCII. Dessa forma, os usuários não têm que ver um monte de? quando você tinha que passar o seu texto através de um sistema ascii legado 7-bit.

>>> from unidecode import unidecode
>>> print unidecode(u"\u5317\u4EB0")
Bei Jing 

http://www.tablix.org/~avian / blog / arquivos / 2009/01 / unicode_transliteration_in_python /

Outras dicas

Na minha resposta original, eu também sugeriu unicodedata.normalize. No entanto, eu decidi testá-lo e verifica-se que não funciona com Unicode aspas. Ele faz um bom trabalho traduzir caracteres Unicode acentuados, então eu estou supondo unicodedata.normalize é implementado usando a função unicode.decomposition, o que me leva a crer que provavelmente só pode lidar com caracteres Unicode que são combinações de uma letra com um sinal diacrítico, mas estou não é realmente um especialista sobre a especificação Unicode, para que eu pudesse apenas ser cheio de ar quente ...

Em qualquer caso, você pode usar unicode.translate para lidar com caracteres de pontuação em seu lugar. O método translate leva um dicionário de ordinais Unicode para ordinais Unicode, assim você pode criar um mapeamento que traduz Unicode-only pontuação para a pontuação ASCII compatível com:

'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 eu não acho que você necessariamente precisa se preocupar sobre como lidar com cada caractere de pontuação Unicode. Se você do necessidade de acentos punho e outros sinais diacríticos, você ainda pode usar unicodedata.normalize para lidar com esses caracteres.

É uma pergunta interessante.

O Google me ajudou a encontrar desta página que descibes usando o unicodedata módulo como o seguinte:

import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')

Há adicional discussão sobre isso em http://code.activestate.com/recipes/251871/ que tem a solução NFKD e algumas maneiras de fazer uma tabela de conversão, para coisas como ± => +/- e outros caracteres não-letra.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top