2009-03-12 18 views
7

Tengo un script de Perl que está siendo llamado por terceros para enviarme los nombres de las 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 (...).¿Cómo puedo convertir caracteres no ASCII codificados en UTF8 en equivalentes ASCII en Perl?

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 basura como "ПоÐ'Ñ € Ð ° жР° нÑкР° NORTE". Tengo que hacer un seguimiento con el cliente y pedirle una "versión de personaje latino" de su nombre para poder emitir un código de registro.

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

Parece que puedo usar Lingua :: Cyrillic :: Translit :: ICAO más Lingua :: DetectCharset para manejar cirílico, pero preferiría algo que también funcione con otros juegos de caracteres.

Respuesta

12

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

+0

Justo lo que estaba buscando - ¡Gracias! :-) –

0

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

+0

Dentro de más de 10 años de desarrollo shareware, tenía solamente un puñado de clientes de Japón y China. Unicode: habilitar todos mis programas shareware solo para encargarse de una pequeña molestia sería exagerado. Estoy más buscando un enfoque rápido y sucio en este caso. –

+0

Entonces tal vez (solo tal vez), ¿podría encontrar muchos más clientes si habilitara utf-8? – innaM

+0

Algunos: sí. Mucho y vale la pena el tiempo de desarrollo: No. La piratería es un gran problema en el negocio de shareware, especialmente en países como China. El mercado japonés no está mal, pero por lo que he escuchado de otros autores de shareware, generalmente no vale la pena a menos que tengas un título realmente grande. –

0

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

+0

+1. La transliteración no es un simple negocio de sustituir personajes individuales. O admite Unicode correctamente o solo admite ASCII; cualquier cosa intermedia se vuelve desordenada rápidamente. – bobince

+0

Sin embargo, cada vez que le pregunto a alguien de Rusia por su nombre, él es capaz de proporcionar una versión de carácter latino de la misma. Soy consciente de que algunos personajes son solo aproximaciones aproximadas, pero obviamente tiene que haber una solución a mi problema. –

+0

Bueno, algunos nombres que le dan como equivalentes latinos no son sus nombres "reales". –

0

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

Asegúrese de que los datos de entrada es realmente una cadena UTF-8.

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 frase debería decir:

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

Esto también se conoce como UCS-2.

Si desea convertir cadenas que son realmente UTF-8, que lo haría así:

my $decode_status = utf8::decode($input_to_be_converted); 
my $converted_string = unidecode ($input_to_be_converted); 
Cuestiones relacionadas