Como posso converter caracteres não-ASCII codificados em UTF-8 para ASCII-equivalente em Perl?

StackOverflow https://stackoverflow.com/questions/638060

Pergunta

Eu tenho um script Perl que está sendo chamado por terceiros para me enviar nomes de pessoas que se inscreveram meu software. Uma dessas partes codifica os nomes em UTF-8, então eu adaptei meu script de acordo com decodificação UTF-8 para ASCII com Encode :: decode_utf8 (...).

Isso geralmente funciona bem, mas a cada 6 meses ou assim que um dos nomes contém caracteres cirílicos, gregos ou romeno, de modo a descodificar os resultados nome em caracteres de lixo como "ПоÐ'Ñ € Ð ° жР° нÑкР° Ñ ". Eu tenho que seguir-up com o cliente e pedir-lhe para uma "versão em caracteres latinos" de seu nome, a fim de emitir um código de registo.

Assim, há qualquer módulo Perl que pode detectar se existem tais personagens e automaticamente traduz-los para a sua representação mais próximo ASCII, se necessário?

Parece que eu posso usar Lingua :: cirílico :: Translit :: ICAO mais Lingua :: DetectCharset para lidar com cirílico, mas eu preferiria algo que funciona com outros conjuntos de caracteres também.

Foi útil?

Solução

Eu acredito que você pode usar Text :: Unidecode para isso, é precisamente o que tenta fazer.

Outras dicas

Se você tem que lidar com dados UTF-8 que não estão no intervalo ASCII, a sua melhor aposta é a de mudar o seu backend para que ele não engasgar com utf-8. Como você iria sobre sinais Transliterando kanji?

Se você receber texto cirílico não há "representação ASCII mais próximo" para muitos caracteres.

Na documentação para Text :: Unicode, em "Avisos", parece que esta frase está incorreta:

Certifique-se de que os dados de entrada é realmente uma string UTF-8.

UTF-8 é uma codificação de comprimento variável, enquanto textos :: Unidecode apenas aceita um de comprimento fixo (de dois bytes) que codifica para cada caractere. Assim que a sentença deve ler:

Certifique-se de que os dados de entrada é realmente uma seqüência de dois bytes caracteres Unicode.

Isto também é referido como UCS-2.

Se você quiser converter seqüências que realmente são utf8, você faria assim:

my $decode_status = utf8::decode($input_to_be_converted);
my $converted_string = unidecode ($input_to_be_converted);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top