#1 Le 10/03/2018, à 05:51
- ar barzh paour
[Résolu] codification sur 1 ou 2 caractères
bon jour à tous
je me suis fait un shell qui me transforme certains caractères d'un fichier en d'autres caractères
par exemple "É" en "E" , ce programme fonctionne bien ! tant que les caractères sont codés sur un seul caractère
le résultat du traitement va dans tmp.txt
un extrait du code
# shell sup_accent : prend le fichier en entrée et met le résultat dans tmp.txt
# par une succession de "tr"
tr $'\xc0'$'\xc1'$'\xc2'$'\xc3'$'\xc4'$'\xc5'$'\xc6' AAAAAAA # transforme ÀÁÂÃÄÅÆ en A
tr $'\xc8'$'\xc9'$'\xca'$'\xcb' EEEE # transforme ÈÉÊË en E
# etc
mais pour effectuer un test j'ai voulu faire la même chose "manuellement"
- demander un caractère
- écrire un caractère dans un fichier
- traiter ce fichier
et là j'ai eu un problème car voilà ce que j'ai fait et ça ne fonctionne pas ( comme je l'aurais souhaité)
echo "donner un caractère : " ; read car # je réponds par exemple É ( Alt Gr Shift é )
echo "$car" > tmp1.txt
./sup_accent "tmp1.txt" # appel du shell sup_accent le résultat va dans tmp.txt
pourquoi ça ne fonctionne pas :
si je regarde le source tmp1.txt je trouve C3 89 0A
à la transformation je me retrouve avec 41 89 0A (C3 transformé en A , 89 non transformé)
le résultat attendu était bien sur "E" 45 0A (code de E)
évidemment après analyse je vois pourquoi ça ne marche pas
la cause :
le shell ne traite pas correctement le fichier source si des caractères sont codés sur deux octets
pour l'instant sup_accent fonctionne car j'ai vérifié que les fichiers sources sont bien codés sur un seul caractère , mais sait-on jamais .... ( ce sont des fichiers récupérés sur internet )
le problème est apparu quand j'ai voulu effectuer des tests plus poussés par saisie
peut-être y a-t-il une solution assez simple ?
Dernière modification par ar barzh paour (Le 14/03/2018, à 10:18)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#2 Le 10/03/2018, à 07:05
- pingouinux
Re : [Résolu] codification sur 1 ou 2 caractères
Bonjour,
Par exemple
#!/bin/bash
while true
do
read lig
[ "$lig" = "" ] && break
sed 's/[ÀÁÂÃÄÅÆ]/A/g;s/[ÈÉÊË]/E/g' <<<"$lig"
done
Pour sortir du script, entrer une ligne vide.
Hors ligne
#3 Le 10/03/2018, à 08:02
- MicP
Re : [Résolu] codification sur 1 ou 2 caractères
Bonjour
Ou alors,
convertir les caractères encodés UTF8
en caractères encodés en ASCII :
#!/bin/bash
while true
do
read lig
[ "$lig" = "" ] && break
iconv -f utf8 -t ascii//TRANSLIT <<<"$lig"
done
Dernière modification par MicP (Le 10/03/2018, à 08:09)
Hors ligne
#4 Le 10/03/2018, à 08:28
- pingouinux
Re : [Résolu] codification sur 1 ou 2 caractères
Bien vu, MicP. Je ne connaissais pas //TRANSLIT, et c'est effectivement plus simple.
Dernière modification par pingouinux (Le 10/03/2018, à 08:28)
Hors ligne
#5 Le 10/03/2018, à 09:21
- MicP
Re : [Résolu] codification sur 1 ou 2 caractères
…si je regarde le source tmp1.txt je trouve C3 89 0A
à la transformation je me retrouve avec 41 89 0A (C3 transformé en A , 89 non transformé)…
En fait, ce n'est pas tout à fait comme ça que ça se passe :
C3 89 est la suite (en notation hexadécimale) des deux octets correspondants au caractère É encodé en UTF-8
tout comme F0 9F 98 90 est la suite (en notation hexadécimale) des 4 octets correspondants à l'émoticon (NEUTRAL FACE) encodé en UTF-8
et C3 88 est la suite (en notation hexadécimale) des deux octets correspondants au caractère È encodé en UTF-8
0A est le retour à la ligne (en UTF-8 comme en ASCII) qui a été généré par l'appuis de la touche entrée
Dernière modification par MicP (Le 10/03/2018, à 09:40)
Hors ligne
#6 Le 10/03/2018, à 10:41
- ar barzh paour
Re : [Résolu] codification sur 1 ou 2 caractères
@ MicP
oui , quand je disais "source" , je voulais dire en regardant le contenu de tmp1.txt après avoir effectué
echo "$cat" > tmp1.txt
j'aurais du regarder entre les deux le forum car après le post 2 de pingouinux voilà ce que j'ai fait
#!/bin/bash
# utilisation cat <fichier> | ./accentV2 > tmp.txt
# .accentV2 < <fichier> > tmp.txt
# echo <chaine> | ./accentV2
# res=$( echo <chaine> | ./accentV2 )
# ./accentV2 <<< <chaine
# res=$( ./accentV2 <<< <chaine )
# d'après MicP
# revoir iconv -f utf8 -t ascii//TRANSLIT <<<"$lig"
# d'après pingouinux
sed "s/[ÀÁÂÃÄÅÆ]/A/g; \
s/[ÈÉÊË]/E/g; \
s/[ÌÍÎÏ]/I/g; \
s/[ÒÓÔÕÖØ]/O/g; \
s/[ÙÚÛÜ]/U/g; \
s/Ç/C/g; \
s/Ñ/N/g; \
s/[àáâãäåæ]/a/g; \
s/[èéêë]/e/g; \
s/[ìíîï]/i/g; \
s/[òóôõø]/o/g; \
s/[ùúûü]/u/g; \
s/ç/c/g; \
s/ñ/n/g"
quand j'aurais été un peu plus loin dans mon application je reviendrai étudier iconv et TRANSLIT
Dernière modification par ar barzh paour (Le 11/03/2018, à 16:18)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#7 Le 11/03/2018, à 07:54
- ar barzh paour
Re : [Résolu] codification sur 1 ou 2 caractères
une remarque qui peut servir à d'autres
j'ai compris pourquoi en plus j'avais des soucis avec mon application qui traite des fichiers contenant des caractères "exotiques"
ces fichiers sont contenus dans des fichiers zip
je dézippe j'obtiens bien des fichiers .asc dont les caractères sont codés de 00 à FF
IS-8859 text
exemple Ø est codé D8
maintenant j'ouvre un de ces fichiers AC_CCI.asc
je fais un copié par
Ctrl a , CTRL c
j'ouvre mon éditeur
je copie par Ctrl v
j'enregistre le fichier AC_CCI-copié.asc
et maintenant je vérifie le codage :
jpb@jpb-desktop:$ file AC*
AC_CCI.asc: ISO-8859 text
AC_CCI-copié.asc: UTF-8 Unicode text
jpb@jpb-desktop:$
exemple Ø est codé maintenant C3 98
CQFD mais je ne m'y retrouvais plus
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#8 Le 11/03/2018, à 09:36
- ar barzh paour
Re : [Résolu] codification sur 1 ou 2 caractères
@MicP
iconv -f utf8 -t ascii//TRANSLIT <AC_CCI.asc
15.64486,68.08186,"HAMARiconv: séquence d'échappement non permise à la position 24
# (le caractère est xD8)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#9 Le 11/03/2018, à 10:43
- pingouinux
Re : [Résolu] codification sur 1 ou 2 caractères
C'est parce que cet encodage n'est pas de l'utf8.
$ iconv -f latin1 -t utf8 <<<$'\xd8'
Ø
Hors ligne
#10 Le 11/03/2018, à 16:16
- ar barzh paour
Re : [Résolu] codification sur 1 ou 2 caractères
mince dans mon post #8 il me manque une partie des infos que je pensais avoir mises
Si la chaîne // TRANSLIT est ajoutée à l'encodage, les caractères convertis sont translittérés lorsque cela est nécessaire et possible. Cela signifie que lorsqu'un caractère ne peut pas être représenté dans le jeu de caractères cible, il peut être approché par un ou plusieurs caractères similaires. Les caractères qui sont en dehors du jeu de caractères cible et qui ne peuvent pas être translittérés sont remplacés par un point d'interrogation (?) Dans la sortie.
je m'attendais à un ? et non une erreur ou alors je comprends mal le texte (traduction Goo...)
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#11 Le 11/03/2018, à 19:16
- pingouinux
Re : [Résolu] codification sur 1 ou 2 caractères
Il faut que l'encodage de départ soit correct.
$ iconv -f latin1 -t ascii//TRANSLIT <<<$'\xd8'
?
Hors ligne
#12 Le 12/03/2018, à 12:00
- ar barzh paour
Re : [Résolu] codification sur 1 ou 2 caractères
du coup ma question change
si pour un fichier on peut connaître l'encodage
quelques exemples pour différents fichiers que j'ai
for f in f0 f1 f2 3 f4 f5 f6 f7 f8 f9 f10
do
file $f
done
f1 : UTF-8 Unicode text, with no line terminators
f2 : UTF-8 Unicode text, with no line terminators
f3 : Non-ISO extended-ASCII text, with no line terminators
f4 : ISO-8859 text, with no line terminators
f5 : Non-ISO extended-ASCII text, with no line terminators
f6 : data
f7 : ASCII text
f8 : Non-ISO extended-ASCII text, with LF, NEL line terminators
f9 : ISO-8859 text
f10: UTF-8 Unicode text
cette question est peut-être saugrenue !!!!
peut-on connaître l'encodage d'une variable ?
$ iconv -f latin1 -t ascii//TRANSLIT <<< "$parametre"
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne
#13 Le 12/03/2018, à 15:45
- pingouinux
Re : [Résolu] codification sur 1 ou 2 caractères
peut-on connaître l'encodage d'une variable ?
echo "$parametre" | file -
Ajouté : Ou mieux
file - <<<"$parametre"
Dernière modification par pingouinux (Le 13/03/2018, à 07:20)
Hors ligne
#14 Le 14/03/2018, à 10:18
- ar barzh paour
Re : [Résolu] codification sur 1 ou 2 caractères
ok je crois qu'avec tout ça j'ai eu les réponses , je mets résolu
file - <<< "$res"
/dev/stdin: ASCII text
merci à tous les deux @MicP et @Pingouinux
PC : B760M DS3H DDR4, 12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 20.04, 22.04, 24.04 (en test )
Portable1 : ThinkPad P50 I7-6820HQ, 16G0 Ram Ubuntu 22.04 Ubuntu 24.04 , W10-PRO( en voyage )
Portable2 : T5750 @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )
Hors ligne