¿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).
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
:La bandera
-Mutf8
carga el móduloutf8
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 funcionesutf8::decode
yutf8::encode
.Con estas banderas, la sustitución de regex debería funcionar como se espera.