Virer caractère unicode

Dans un fichier UTF-8 je voudrais remplacer tous les caractères unicode (codé sur deux caractères) par un seul caractère générique genre ‘*’ en Shell KSH de préférence. ça semble faisable pour quelqu’un ?

Bonjour

oui convertir ton fichier utf8 en latin1

http://www.math.u-bordeaux1.fr/imb/cellule/article101.html

Avec iconv

  • De ISO-8859-1 vers UTF-8 : iconv -f latin1 -t utf8 fichier.tex > fichier-utf8.tex
  • De UTF-8 vers ISO-8859-1 : iconv -f utf8 -t latin1 fichier.tex > fichier-iso.tex

avec recode (faire une sauvegarde avant)

  • De ISO-8859-1 devient UTF-8 : recode -d latin1…utf8 fichier.tex
  • De UTF-8 devient ISO-8859-1 : recode -d utf8…latin1 fichier.tex

sinon utiliser des expressions régulières avec vim (ou emacs)

@limax Attention, ta solution ne correspond pas à la question.

debianhadic demande comment éliminer tous les code points >= 0x80 (car c’est la limite à partir de laquelle les caractères occupent plus d’un octet en UTF-8). Autrement dit, il ne veut garder que les caractères ASCII 0x00 => Ox7F inclus.

Toi tu proposes de transformer la chaîne en 8859-1, mais ce code page inclut des caractères qui ne correspondent pas à la demande et qui seront pourtant convertis correctement entre les deux codepage (exemple : [mono]é[/mono] est tout à fait valide en 8859-1 mais son code point est > 0x80 – la flemme de chercher la valeur exacte).

Merci Syam de ta précision c’est exactement ça !

Je réponds car c’est exactement ce que j’ai essayé de faire aussi il y a 2 jours !!

oui effectivement j’ai un peu répondu à coté.

Avec vim:
:%s/[<80>-ÿ]/*/g
où <80> esr obtenu en appuyant sur ctrl+V x80
et ÿ est obtenu en appuyant sur ctrl+V xff

tu peux sans doute faire la même chose depuis ton shell avec awk ou autre

edit: est ce que cela répond à la question?

Mais la tu fais un traitement pour un caractère, je veux pour tous, donc je ne vais pas faire un script sur les milliers de codes possibles !!

Bon je viens de trouver comment faire fonctionner [mono]sed[/mono]. :041 Tous mes essais jusqu’à présent étaient des échecs parce que j’étais resté en locale UTF-8 et forcément quand je lui disais 0x80 ou 0xFF il comprenait “caractère Unicode dont le code point est…” et non pas “octet”. :unamused:

Bref, en syntaxe [mono]bash[/mono] (j’ai essayé avec [mono]dash[/mono], la syntaxe [mono]$’\x80’[/mono] fonctionne pas, pour [mono]ksh[/mono] je doute aussi) ça donne :

[code]filter_utf8_nonascii() {
LANG=’’ sed “s@[”$’\x80’-$’\xBF’]"@@g;s@["$’\xC0’-$’\xFF’"]@$1@g"
}

$ echo “texte avé des caractères non ascii” | filter_utf8_nonascii '
texte av
des caract*res non ascii

$ echo “texte avé des caractères non ascii” | filter_utf8_nonascii ‘ê’
texte avê des caractêres non ascii[/code]
Explication :
[ul][li] Utiliser temporairement une locale vide (équivalente à “C”), juste le temps de faire le [mono]sed[/mono]. Permet de considérer 1 caractère = 1 octet.[/li]
[li] Dans un caractère multi-octets tous les octets qui le composent sont >= 0x80. Le premier de ces multiples octets a une valeur de 0xC0 à 0xFF, et tous les suivants ont une valeur de 0x80 à 0xBF (voir n’importe quelle spec UTF-8). Donc…
[list][] Effacer complètement les octets “de fin” 0x80 à 0xBF. Permet de n’obtenir qu’un seul caractère de remplacement peu importe le nombre d’octets qui compose le caractère d’origine.[/li]
[li] Remplacer les octets “de tête” 0xC0 à 0xFF par le caractère de remplacement choisi. L’ordre est important car si on choisit un caractère de remplacement non-ASCII (un peu contradictoire avec la question d’origine, mais bref, ça marche), l’ordre inverse poserait problème.[/li][/ul][/
:m][/list:u]

Au pire si tu tiens absolument à utiliser [mono]ksh[/mono] tu n’as plus qu’à trouver l’équivalent de [mono]$’\x80’[/mono] etc.

Et bien sûr c’est spécifique à l’UTF-8, ça ne passerait pas tel quel en UTF-16 ou UTF-32. Pour une raison que j’ignore le truc logique [mono]sed “s@[^”$’\x00’-$’\x7F’]"@$1@g"[/mono] en restant dans la locale d’origine ne veut pas fonctionner, il me remplace tous les caractères. :12

[\x80-\xff] est la plage des caractères de x80 à xff
Il me semble que c’est ce que tu voulais.

Ha Ok :slightly_smiling: Toutes mes confuses !!
Je regarde de plus prêt.

@Syam -> à première vue ça semble bien, je test !

Merci à vous deux, ça fonctionne très bien !

Juste pour info j’ai utilisé '-i" avec sed sans passer par une fonction, je devais le faire sur tout un fichier.
J’ai pas réussi à le faire en ksh du coup j’ai fait un script en indiquant bash comme langage et ça fonctionne !

Tout était bien dans le meilleur des mondes, jusqu’à ce que, je reçoive un fichier en iso-8859-1 avec un caractère qui correspond à :
[mono]s@["$’\x80’-$’\xBF’]"@@g[/mono]
Mais aucun qui correspondait à :
[mono]s@["$’\xC0’-$’\xFF’"]@$subChar@g[/mono]
Du coup le caractère bizarre à été effacé il n’y a pas eu de caractère de remplacement, mon fichier a été décalé d’un caractère et ça a cassé le process …
Donc je me suis dit, je vais inverser le remplacement, subChar avec la première expression et rien avec la deuxième, mais avant de le faire je voudrais votre avis, ça peut être déconnant ?