es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo utilizar caracteres Unicode en el comando de substitución de expresiones regulares de Perl?

Esto no funciona al usar caracteres Unicode (en Ubuntu bash):

$ perl -pC -e's/[à]/a/gu' <<< 'à'
à
$ perl -pC -e's/[b]/a/gu' <<< 'b'
a

Aunque parece ser compatible con PCRE (al menos según regex101).

¿Qué estoy haciendo mal? ¿Me falta alguna bandera en el comando de Perl?

Esto “simplemente funciona” en JavaScript, por lo que estaría usando Node si pudiera encontrar una solución en una línea de comando … pero aún así quiero saber por qué el comando de Perl no está funcionando.


En contexto:

Estoy tratando de usar sustituciones como /[àâáãä]/a/g, /[òôóõö]/o/g, etc., para convertir un archivo de diccionario a ASCII (es decir, eliminar acentos, etc., de una lista de palabras), para poder usarlo en una verificación ortográfica insensible a los acentos (por ejemplo, en IntelliJ Idea).

Básicamente, estos son los pasos para crear un diccionario adicional “asciificado”:
1. Descargar el archivo .dic del idioma (lista de todas las palabras).
2. Usar grep para filtrar las palabras que contengan caracteres no ASCII o que se puedan reemplazar.
3. Usar sustituciones de expresiones regulares sucesivas para hacer que las palabras sean insensibles a los acentos.
4. Importar el archivo .dic asciificado en el IDE (además del diccionario de idioma estándar).

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con el comando perl es que no maneja correctamente los caracteres unicode. La bandera -pC solo habilita el modo UTF-8, pero no maneja otras codificaciones. Para manejar correctamente los caracteres unicode, se debe utilizar la bandera -Mutf8 además de la bandera -C:

    $ perl -Mutf8 -CSDA -pe 's/[à;]/a/g' <<< 'à'
    a
    

    La bandera -Mutf8 carga el módulo utf8 que maneja correctamente los caracteres unicode. Además, la bandera -CSDA habilita el modo UTF-8 y establece la codificación de salida en UTF-8, además de activar las funciones utf8::decode y utf8::encode.

    Con estas banderas, la sustitución de regex debería funcionar como se espera.

Comments are closed.