¿Cómo puedo convertir caracteres no ASCII codificados en UTF8 a equivalentes ASCII en Perl?

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

Pregunta

Tengo un script de Perl que está siendo llamado por terceros para enviarme nombres de personas que han registrado mi software. Una de estas partes codifica los nombres en UTF-8, por lo que he adaptado mi script en consecuencia para decodificar UTF-8 a ASCII con Encode :: decode_utf8 (...).

Esto generalmente funciona bien, pero cada 6 meses más o menos uno de los nombres contiene caracteres cirílicos, griegos o rumanos, por lo que decodificar el nombre da como resultado caracteres de basura como '' ÐŸÐ¾Ð´Ñ € Ð ° жР° нÑкР° Ñ ??" ;. Tengo que hacer un seguimiento con el cliente y pedirle una "versión en caracteres latinos". de su nombre para emitir un código de registro.

Entonces, ¿hay algún módulo Perl que pueda detectar si hay tales caracteres y los traduzca automáticamente a su representación ASCII más cercana si es necesario?

Parece que puedo usar Lingua :: Cyrillic :: Translit :: ICAO plus Lingua :: DetectCharset para manejar Cyrillic, pero preferiría algo que también funcione con otros conjuntos de caracteres.

¿Fue útil?

Solución

Creo que podría usar Text :: Unidecode para esto, es precisamente lo que intenta hacer.

Otros consejos

Si tiene que lidiar con datos UTF-8 que no están en el rango ASCII, su mejor opción es cambiar su backend para que no se ahogue con utf-8. ¿Cómo harías para transcribir los signos kanji?

Si obtiene texto cirílico, no hay "representación ASCII más cercana" para muchos personajes.

En la documentación de Text :: Unicode, en "Advertencias", parece que esta frase es incorrecta:

Asegúrese de que los datos de entrada realmente sean una cadena utf8.

UTF-8 es una codificación de longitud variable, mientras que Text :: Unidecode solo acepta una codificación de longitud fija (dos bytes) para cada carácter. Entonces esa oración debería leer:

Asegúrese de que los datos de entrada realmente sean una cadena de caracteres Unicode de dos bytes.

Esto también se conoce como UCS-2.

Si desea convertir cadenas que realmente son utf8, lo haría así:

my $decode_status = utf8::decode($input_to_be_converted);
my $converted_string = unidecode ($input_to_be_converted);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top