Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( 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