Eu tenho um arquivo em UTF-8 que contém textos em vários idiomas. Muitos são nomes de pessoas. Preciso convertê-lo para ASCII e preciso que o resultado pareça o mais decente possível.
Existem várias maneiras de abordar a conversão de uma codificação mais ampla para uma mais estreita. A transformação mais simples seria substituir todos os caracteres não ASCII por algum espaço reservado, como '_'. Se eu sei o idioma em que o arquivo está escrito, há possibilidades adicionais, como romanização.
Que ferramenta Unix ou biblioteca de linguagem de programação disponível no Unix pode me proporcionar uma conversão decente (com o melhor esforço) de UTF-8 para ASCII?
A maior parte do texto está em idiomas europeus, baseados no tipo latino.
character-encoding
text
natural-language
user7610
fonte
fonte
iconv
etr
, existe o Unidecode . Eu não estou familiarizado com isso, mas pode fazer o que você quiser, se você puder usar o Python.Respostas:
Ele fará a conversão de melhor esforço, dependendo das tabelas de conversão. Se você conhece aproximadamente o idioma de entrada, existem filtros específicos do idioma que fornecem melhores resultados, por exemplo
é a conversão do esperanto na representação x-metodo,
tentará fazer uma representação teocrática dos diacríticos, existem parâmetros específicos do idioma:
transliterará "ä" para "ae" (habitual para o alemão) em vez de simples "a"
usará regras polonesas para transliterar o russo, em vez das regras "do tipo inglês", etc ...
fonte
konwert
site? É empacotado em algum lugar? github.com/taw/konwert/tree/master/konwert-1.8Isso funcionará para algumas coisas:
echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIT
retornahelloe ?
. Quaisquer caracteres queiconv
não sabem como converter serão substituídos por pontos de interrogação.iconv
é POSIX, mas não sei se todos os sistemas têm aTRANSLIT
opção Funciona para mim no Linux. Além disso, aIGNORE
opção descartará silenciosamente caracteres que não podem ser representados no conjunto de caracteres de destino (consulteman iconv_open
).Uma opção inferior, mas compatível com POSIX, é usar
tr
. Este comando substitui todos os pontos de código não ASCII por um ponto de interrogação. Ele lê texto UTF-8, um byte de cada vez. "É" pode ser substituído porE?
ou?
, dependendo de ter sido codificado usando um acento combinado ou um caractere pré-composto.Esse exemplo retorna
caf? ?????
, usando caracteres pré-compostos.fonte
tr
não deve funcionar um byte de cada vez. GNU tr sim, mas é um bug.iconv -f utf-8 -t ascii//TRANSLIT
funcionou bem para mim. Ele mudou aspas onduladas para aspas retas. Obrigado.//TRANSLIT
também funciona para outros conjuntos de caracteres, por exemploiso-8859-1//TRANSLIT
.iconv
forneceiconv: illegal input sequence at position 1234
e trunca o arquivo para mim. Seria bom se ele apenas deletasse o personagem e tentasse pegar a sequência novamente.experimentar
uni2ascii -B input.txt >output.txt
uni2ascii
fonte
Você quer dizer que deseja converter os seguintes nomes em alguma string ASCII que a pessoa em questão não se oporia?
Eu suspeito que não há ferramenta automatizada que possa fazer isso. Pode haver uma ou muitas latinizações de nomes pessoais. O software não pode escolher a versão culturalmente aceitável. Pelo menos não sem o software saber muito sobre a cultura da pessoa envolvida.
Consulte também /programming//a/1398403/477035
fonte
perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")'
produz `` bd llh lthny bn lHsyn`, que é transliteração suficiente para meus propósitos.Acabei usando Perl com Text :: Unidecode para isso. Exemplo:
produz
bd llh lthny bn lHsyn
, que é um resultado aceitável para meus propósitos.fonte