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

Re: [HS] encoding avec sed



Bonjour,

> 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

en UTF-8, un blanc non-sécable, ça utilise 2 octets (c2a0)
 http://www.fileformat.info/info/unicode/char/00a0/index.htm

D'ailleurs:
   echo -n "### ###" > test
   hexdump test -C
     00000000  23 23 23 c2 a0 23 23 23                           |###..###|
On vois bien qu'il y a 2 octets (évidemment il fallait taper Alt-Espace
entre les caractère "#")

Donc:
   sed  -i 's/\xc2\xa0/ /g' test

> 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.

Ce que tu as fait c'est de remplacer la séquence d'octet "c2a0" (qui est
un blanc insécable) par la séquence "20a0".
On se retrouve avec \x20 est effectivement un blanc "normal", précédé de
l'octet "\xc2".

Ton éditeur de texte se retrouve avec une séquence d'octets qui n'est
pas valide en UTF-8 (un octet entre \xC2 et \xDF doit être suivi de deux
octets compris entre \x80 et \xBF  voir [2])... du coup, ton editeur
continue d'essayer de détecter l'encodage, et choisi latin1, dans ton
cas précis.

Franklin


[2] http://www.fileformat.info/info/unicode/utf8.htm 


Reply to: