Forum Programmation.c Regex et encodage

Posté par  .
Étiquettes : aucune
2
28
sept.
2012

Bonjour,

Voilà, dans mon programme j'utilise la fonction regexec qui prend en argument une chaîne que l'utilisateur entre. Jusque là pas de problème, et ca se passe plutôt bien.

Le problème, c'est que ce programme parse un fichier contenant différents path venant d'un Windows XP, dont certaines parties contiennent des accents. Du coup, ma regex 'Rom.o' ne matche jamais 'Roméo'.

Bon, j'ai fini par saisir que mes noms de paths étaient inscrits dans un encodage de 8bits, alors que mon Linux est en Unicode.
Pour obtenir le même type d'encodage, on peut par exemple taper un printf "Rom\xE9o". Et pour preuve:

$ printf "Rom\xE9o\n" | hexdump -C
00000000  52 6f 6d e9 6f 0a       |Rom.o.|

$ cat list.txt |grep -E 'Rom' | hexdump -C
00000000  52 6f 6d e9 6f 0a       |Rom.o.|

$ echo "Roméo" | hexdump -C
00000000  52 6f 6d c3 a9 6f 0a    |Rom..o.|

Le problème, c'est que si je fais un:

grep -E 'Rom\xE9o' list.txt

je ne matche toujours pas ma ligne…

Auriez-vous une idée?

PS: Mon fichier texte est généré sur Le Linux, après que les répertoires et fichiers soient recopiés à partir du Windows. Il est utilisé par d'autres programmes et regénéré périodiquement mais je ne sais jamais quand. Par conséquent, je ne peux pas le convertir une bonne fois en UTF-8…

  • # La joie des encodages

    Posté par  (site web personnel) . Évalué à 2.

    Les encodages sont une vraie plaie. Le mieux que je puisse te proposer et de passer tous tes inputs dans iconv en spécifiant à ce dernier de te sortir de l'UTF-8, et de passer tes regex par dessus.

    Normalement, iconv est capable de détecter automatiquement l'encodage en entrée, du moins dans mes quelques tests. Ça marchait en tout cas pour ISO-8859-1 et pour CP1252.

    En attendant que tout le monde se mette à utiliser Unicode et plus particulièrement UTF-8, je te souhaite bonne chance !

  • # convertir

    Posté par  (site web personnel) . Évalué à 4.

    Soit tu fais en sorte que ton programme travaille dans l'encodage du fichier, soit tu convertis le fichier avant de le donner à ton programme. Dans tous les cas il faut connaitre l'encodage du fichier original pour pouvoir le traiter correctement. Il y a des heuristiques d'autodétection d'encodage mais c'est une juste une bonne recette pour se retrouver avec des corruptions « incompréhensibles ».

    Voir aussi : iconv(1), iconv(3)

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

  • # Merci!

    Posté par  . Évalué à 0.

    Merci beaucoup à vous 2, je connaissais la commande iconv, mais je ne connaissais pas la fonction…
    Merci, je vais regarder tout ca!

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.