Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/11/2011, à 17:54

ehmicky

Colle : Comment grepper un caractère UTF8 invalide :) ?

Salut à tous,

Certains caractères UTF8 invalides, par exemple, 0xc3 doit toujours être suivi d'un caractère compris entre 0x80 et 0xbf. Dans le cas d'un fichier corrompu, grep et sed plantent sur ces caractères corrompus, ce qui rend difficile la manipulation d'un gros fichier remplis de ces derniers.
Par exemple :

# echo $'a \xc3 b' > essai
# cat essai
a <?> b
# hd essai
00000000  61 20 c3 20 62 0a                                 |a . b.|
# grep "a" essai
a <?> b
# grep $'\x61' essai
a <?> b
# grep $'\xc3' essai
# grep -c $'\xc3' essai
0
# sed 's/./O/g' essai
OO<?>OO

(A noter que j'ai remplacé le caractère imprimé par le terminal par <?> (parce que le forum ne l'affiche pas) et que ce n'est pas le caractère 0xc3, mais une représentation graphique du terminal pour indiquer qu'il n'arrive pas à représenter un caractère corrompu) (A noter aussi que s/\xc3/O/g est possible)

Auriez-vous une solution à ce problème ? Merci smile

Dernière modification par ehmicky (Le 03/11/2011, à 18:02)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#2 Le 03/11/2011, à 18:19

Haleth

Re : Colle : Comment grepper un caractère UTF8 invalide :) ?

sed 's/\xc3/O/g' essai

Tu as toujours des problèmes très interressant, merci pour ces nombreux défis que tu nous soumet tongue


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#3 Le 03/11/2011, à 18:20

sputnick

Re : Colle : Comment grepper un caractère UTF8 invalide :) ?

awk '/\x61/{print "ok"}' essai
ok

On ne peut pas mettre d'array dans un string!
https://sputnick.fr/

Hors ligne

#4 Le 03/11/2011, à 19:03

ehmicky

Re : Colle : Comment grepper un caractère UTF8 invalide :) ?

awk peut se substituer à grep ici, mais le problème persiste pour grep de manière générale.
Pour sed :

Haleth a écrit :
sed 's/\xc3/O/g' essai

Tu as toujours des problèmes très interressant, merci pour ces nombreux défis que tu nous soumet tongue

ehmicky a écrit :

(A noter aussi que s/\xc3/O/g est possible)

Non plus sérieusement roll, cela ne résout pas le problème du wildcard "." dans sed qui ne prend pas en charge les caractères invalides. Parce qu'ici on sait que le caractère est 0xc3, mais ça pourrait être 0xd3, 0xd4, etc.
On pourrait écrire une regex compliquée chargé de checker et éliminer les caractères invalides, mais ça ne résout pas le problème, qui est que si "." dans sed ne les prend pas en charge, ça fait planter tout script utilisant sed, pour peu qu'on lui donne en input un fichier corrompu.

Edit : par exemple, tout sed utilisant ".*" : .* s'arrêtera au premier caractère corrompu. On peut renvoyer la faute à l'utilisateur en disant "il n'a qu'à pas donner de fichier corrompus". Mais bon l'idée c'est toujours de supposer que l'utilisateur donnera les inputs les plus tordus possibles, sinon pourquoi mettre des guillemets autour de "$VAR", pourquoi utiliser find -print0, etc.

Dernière modification par ehmicky (Le 03/11/2011, à 19:12)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#5 Le 03/11/2011, à 19:28

aduxas

Re : Colle : Comment grepper un caractère UTF8 invalide :) ?

Tiens, chez moi:

$ grep $'\xc3' essai
a <?> b

par contre, sed ignore le caractère.

A noter:

$ tr '\303' '0' <essai
a 0 b

Et donc tu fais tout cela sous root?  Ou as-tu juste changé ton prompt pour nous faire peur?

Edit:

$ grep -c $'\xc3' essai
1

Dernière modification par aduxas (Le 03/11/2011, à 20:21)

Hors ligne

#6 Le 03/11/2011, à 21:00

ehmicky

Re : Colle : Comment grepper un caractère UTF8 invalide :) ?

C'est bizarre, moi j'ai :

# grep -c $'\xc3' <<<$'\xc3'
0
# type grep
grep is hashed (/bin/grep)
# grep --version | head -n1
grep (GNU grep) 2.9

Par contre avec grep -P, cela marche smile

Dernière modification par ehmicky (Le 03/11/2011, à 21:03)


Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?

Hors ligne

#7 Le 03/11/2011, à 22:42

aduxas

Re : Colle : Comment grepper un caractère UTF8 invalide :) ?

$ type grep
grep is /usr/bin/grep
$ grep --version | head -1
GNU grep 2.5.2

Hors ligne

#8 Le 04/11/2011, à 17:15

gerarmentor

Re : Colle : Comment grepper un caractère UTF8 invalide :) ?

Ca marche avec ssed ("super-sed", une version améliorée de gnu sed)

$ sed 's/.*/ok/'  <<<$'a \xc3 ab'
ok<?> ab
$ ssed 's/.*/ok/'  <<<$'a \xc3 ab'
ok

Hors ligne

#9 Le 04/11/2011, à 22:11

aduxas

Re : Colle : Comment grepper un caractère UTF8 invalide :) ?

D'autres idées:

$ grep -c '[^[:print:]]' <<<$'a \xc3 b'
1
$ grep -c '[:xc3:]' <<<$'a\xc3 b'
0

Ce dernier doit avoir une erreur?!

Hors ligne

#10 Le 05/11/2011, à 18:05

medoc

Re : Colle : Comment grepper un caractère UTF8 invalide :) ?

Pour supprimer les caracteres invalide d'un fichier suppose encode en utf-8: iconv -c -f utf-8 -t utf-8

Mais si tu fais cela, tu travailles ensuite sur un fichier different de l'original, est-ce bien ce que tu veux faire ?

Ton probleme en fait, c'est que dans un contexte UTF-8, tu travailles sur un fichier binaire, pas sur un fichier texte, donc grep ne marche pas.

Une autre approche possible serait de changer de locale pour que grep renonce a interpreter le contenu du fichier comme de l'UTF-8
Par exemple "export LANG=C", puis positionner le terminal (Terminal->set Character Encoding) aussi dans un encoding 8 bits (ex: iso-8859-15), et grep marche et t'affiche normalement le c3 comme un CAPITAL A WITH TILDE (ou kekchose comme ca).

Mais ce qui manque en fait dans ton enonce de probleme c'est la nature reelle de ces donnees: s'agit t'il d'UTF-8 endommage, ou d'un fichier encode autrement (dans un encodage 8bits autre). L'approche qui en decoule logiquement est differente

Hors ligne