[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: