Re: [HS] encoding avec sed
Jean-Michel OLTRA, samedi 6 décembre 2008, 12:17:13 CET
>
>
> Bonjour,
’jour,
> Un HS, mais je ne m'explique pas le comportement de sed.
>
> Sur un fichier encodé en utf-8, je veux remplacer les espaces
> insécables par de véritables espaces :
>
> sed -i 's/\xa0/\x20/g' fichier.sql
>
> Mais en réalité, l'espace insécable est bien remplacée, mais
> il y a un  avant, et le fichier est encodé en latin1.
Euh, c’est pas très clair. Le fichier de départ est en utf-8
et le fichier d’arrivée en latin1 ?
Déjà, si le fichier de départ est en utf-8, alors l’espace
insécable est \xc2\xa0, pas \xa0. \xa0 n’est pas un caractère
utf-8.
Ensuite, si tu enlèves \xa0 sans enlever \xc2, alors le
fichier n’est plus valide vis à vis de l’utf-8 (\xc2\x20 n’est
pas un caractère utf-8 : aucun caractère ascii ne doit / peut
apparaître comme partie d’un autre caractère). Et si ce n’est
plus de l’utf-8, c’est considéré comme du latinX…
Et c’est ce que j’ai chez moi :
$ cat > bla
épaue rauet
^D ^ espace insécable
$ file bla
bla: UTF-8 Unicode text
$ sed -i -e 's/\xa0/\x20/g' bla
^ ne pas oublier de quoter…
$ file bla
bla: ISO-8859 text
Je regarde dedans (zile p.ex. ne sais pas gérer l’Unicode, ce
qui finalement est assez pratique pour ce genre de repérage) et
je vois bien le \302 (=\xc2) tout seul alors que le é est bien
un \303\251.
> Si le fichier est en latin1 avant la substitution, l'espace est
> remplacée, et le fichier est converti en utf-8, ce que je
> trouve normal vu que le terminal l'est également (peut-être
> qu'il n'y a pas de rapport).
Hmm, pas chez moi :
[on reprend avec un bla tout neuf]
$ recode u8..l9 bla
$ file bla
bla: ISO-8859 text
$ sed -i -e 's/\xa0/\x20/g' bla
$ file bla
bla: ISO-8859 text
> Si quelqu'un sait ? Ce n'est pas vital, juste curieux, pour
> moi.
--
Sylvain Sauvage
Reply to: