Convertendo um arquivo UTF-8 para ASCII (best-effort)

15

Eu tenho um arquivo em UTF-8 que contém textos em vários idiomas. Muito disso são nomes de pessoas. Eu preciso convertê-lo para ASCII e preciso que o resultado seja o mais decente possível.

Existem muitas maneiras de abordar a conversão de uma codificação mais ampla para uma mais restrita. A transformação mais simples seria substituir todos os caracteres não-ASCII por algum espaço reservado, como '_'. Se eu souber a língua em que o arquivo está escrito, existem outras possibilidades, como a romanização.

Qual ferramenta Unix ou biblioteca de linguagens de programação disponível no Unix pode me dar uma conversão decente (melhor esforço) de UTF-8 para ASCII?

A maior parte do texto está em idiomas europeus, baseados em tipos latinos.

    
por user7610 06.12.2014 / 17:53

5 respostas

9
konwert utf8-ascii

Ele fará a conversão de melhor esforço, dependendo das tabelas de conversão. Se você souber aproximadamente o idioma de entrada, existem filtros específicos de idioma que fornecem melhores resultados, por exemplo,

konwert utf8-xmetodo

é a conversão do esperanto na representação x-metodo,

konwert UTF8-tex

tentará fazer a representação TeX de diacríticos, existem parâmetros específicos da linguagem:

konwert UTF8-ascii/de

transliterará "ä" para "ae" (habitual para alemão) em vez de simples "a"

konwert UTF8-ascii/rosyjski

usará as regras polonesas para transliterar o russo, em vez das "inglesas", etc ...

    
por 09.10.2015 / 17:36
18

Isso funcionará para algumas coisas:

iconv -f utf-8 -t ascii//TRANSLIT

echo ĥéĺłœ π | iconv -f utf-8 -t ascii//TRANSLIT retorna helloe ? . Todos os caracteres que iconv não sabem converter serão substituídos por pontos de interrogação.

iconv é POSIX, mas não sei se todos os sistemas têm a opção TRANSLIT . Isso funciona para mim no Linux.

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ê o texto UTF-8 um byte de cada vez. "É" pode ser substituído por E? ou ? , dependendo se foi codificado usando um acento de combinação ou um caractere pré-composto.

echo café äëïöü | tr -d '0-7' | tr '0-7' '[?*]'

Esse exemplo retorna caf? ????? , usando caracteres pré-compostos.

    
por 07.12.2014 / 01:40
1

I have a file in UTF-8 that contains [people's names] in multiple languages [that I want to convert to something meaningfull in ASCII].

Você quer dizer que você quer converter os seguintes nomes em alguma string ASCII que a pessoa em questão não faria objeção?

  • ஸ்றீனிவாஸ ராமானுஜன் ஐயங்கார்
  • عبد اللهالثاني بن الحسين

Eu suspeito que não há nenhuma ferramenta automatizada que possa fazer isso. Pode haver ou não muitas 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.

Veja também o link

    
por 02.09.2015 / 17:07
0

Acabei usando o Perl para isso. Exemplo:

perl -e 'use utf8; use Text::Unidecode; print unidecode("عبد الله الثاني بسين")

produz bd llh lthny bn lHsyn , o que é um resultado aceitável para os meus propósitos.

    
por 18.09.2016 / 12:58
0

tente uni2ascii -B input.txt >output.txt

uni2ascii

    
por 20.07.2017 / 13:04