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 24/09/2013, à 16:26

Valeryan_24

Convertir les caractères spéciaux d'un fichier texte en code Iso

Bonjour,

Malgré mes recherches, je bloque sur un petit problème d'encodage.

Afin d'utiliser la nouvelle fonction de gestion des signets dans un fichier pdf par pdftk, je cherche comment convertir automatiquement les caractères spéciaux (accents...) pour les remplacer par leur code Iso : en effet, si l'on veut un affichage correct dans le lecteur pdf par la suite (Evince...), il est indispensable que le fichier txt que l'on donne à traiter à pdftk ne comprenne pas de caractères spéciaux mais leur code Iso.

Ainsi, au lieu de "é", il faut écrire "é"

Et pour "Réunion" : "Réunion" etc...

Sauf que pour un grand nombre de mots à taper, lorsqu'on ne connaît pas par cœur le code correspondant, s'il faut à chaque fois chercher dans la table de caractères et copier-coller, c'est fastidieux.

D'où ma demande : existe-t-il dans gedit (ou autre logiciel) une fonction (auto-correction) / un plugin / un format d'enregistrement (par défaut c'est utf8) qui transforme automatiquement les caractères spéciaux (mais uniquement eux) par leur code Iso ?

Ou alors avec la commande iconv mais dans ce cas quel est le format de sortie à préciser ?

Merci d'avance smile

Hors ligne

#2 Le 24/09/2013, à 16:35

ar barzh paour

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

une piste si tu ne connais pas
dans un terminal tu tapes man iconv
dans un terminal tu tapes iconv --list (donne la liste des formats utilisables)
la liste est impressionnante , il faut effectivement savoir ce que l'on veut faire !

Dernière modification par ar barzh paour (Le 24/09/2013, à 16:37)


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

#3 Le 24/09/2013, à 16:45

Valeryan_24

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Oui, la liste des possibilités de iconv est impressionnante, mais j'ignore si l'un de ces formats est celui dont j'ai besoin - cela doit tout de même exister, j'espère !

Hors ligne

#4 Le 24/09/2013, à 16:46

claudius01

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Bonjour,

Et avec la variable LANG, cela ne suffirait pas car chez moi avec :

$ echo $LANG
fr_FR.UTF-8

$ echo "Île de la Réunion" > /tmp/t

$ cat /tmp/t
Île de la Réunion

$ hexdump -C /tmp/t
00000000  c3 8e 6c 65 20 64 65 20  6c 61 20 52 c3 a9 75 6e  |..le de la R..un|
00000010  69 6f 6e 0a                                       |ion.|
00000014

Dans le fichier "/tmp/t", les 2 caractères 'Î' et 'é' sont codés en UTF-8 sur 16 bits


Cordialement, A+
--
Claudius

Hors ligne

#5 Le 24/09/2013, à 16:48

amj

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Salut
Il faut utiliser sed big_smile ou awk

sed 's/<regexp>/<remplacement>/' <fichier>

donc par exemple

sed 's/é/&#233\;/' <fichier.pdf>

il faut mettre \ devant le ; car celui-ci permet d'exécuter plusieurs commandes (ce qui pourrais créer quelques problèmes)
...
Il faut vérifier que ça marche aussi pour les pdf big_smile parce que je ne suis pas sûr dsl

fais un fichier pdf avec par exemple comme contenu "éééAaacqdsfvkéé" pour tester

Dernière modification par amj (Le 24/09/2013, à 16:51)


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#6 Le 24/09/2013, à 16:54

Valeryan_24

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

C'est un fichier .txt (il me servira avec pdftk à intégrer les signets ainsi définis dans le pdf final).

Donc il suffit d'une commande sed avec les différentes chaînes à remplacer ? Faisable, ce sont des titres de chapitre pour le sommaire du pdf, à part des accents je ne vais pas utiliser pléthore de caractères spéciaux.

Il faut séparer les différentes possibilités par un espace ?

Edit : bon, déjà un premier test avec une seule occurrence, si je tente de remplacer Essai par Test, ça marche, mais si je tente de remplacer é par &#233; : rien...

sed -i "s/Essai/Test/g" fichier.txt

Dernière modification par Valeryan_24 (Le 24/09/2013, à 17:05)

Hors ligne

#7 Le 24/09/2013, à 17:06

amj

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Valeryan_24 a écrit :

C'est un fichier .txt (il me servira avec pdftk à intégrer les signets ainsi définis dans le pdf final).

Donc il suffit d'une commande sed avec les différentes chaînes à remplacer ? Faisable, ce sont des titres de chapitre pour le sommaire du pdf, à part des accents je ne vais pas utiliser pléthore de caractères spéciaux.

Il faut séparer les différentes possibilités par un espace ?

sed 's/è/&#232;/' 's/é/&#233;/' -i fichier.txt

presque big_smile
plutôt

sed -e 's/è/&#232\;/;s/é/&#233\;/' -i fichier.txt

il me semble (comme je l'ai dis le ; sert à mettre plusieurs commandes lorsque l'option -e est utiliser il faut alors utilisée un caractère d'échappement \ est alors nécessaire )
Moi je regarde en général sur le site du zero pour sed http://fr.openclassrooms.com/informatiq … mmande-sed l'adresse à changée on dirait neutral

Tu peux créer un script sed aussi

Dernière modification par amj (Le 24/09/2013, à 17:08)


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#8 Le 24/09/2013, à 17:10

grim7reaper

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Salut,

Si tu as Ruby sur ta machine, tu peux tester cet uniligne :

ruby -i.bak -ne 'print($_.unpack("U*").map {|c| (c > 127 ? "&##{c};" : c.chr) }.join)' example.txt

Le fichier original example.txt sera copié en tant que example.txt.bak avant toute modification (sauvegarde de l’original en cas de bourde).
Le fichier example.txt sera modifié par la commande.

Petite explication :
ruby => interpréteur Ruby
-i.bak => l’option -i permet de modifier le fichier directement, si on ajoute une extension (comme ici .bak) le fichier original sera sauvegardé avec cette extention).
-n => fait une boucle qui va lire le fichier passé en argument ligne à ligne
-e => informe Ruby que le code à interpréter est sur la ligne de commande (dans l’argument suivant), pas dans un script.

Ensuite, le code en lui-même :
$_ => variable qui contient la ligne courante du fichier (comme en Perl)
unpack("U*") => décode la chaîne comme une suite de caractères UTF-8.
Exemple :

[1] pry(main)> 'Réunion'.unpack('U*')
=> [82, 233, 117, 110, 105, 111, 110]

map {|c| (c > 127 ? "&##{c};" : c.chr) } => pour chaque valeur, si c’est inférieur à 127 c’est de l’ASCII donc on écrit le caractère tel quel (c.chr), si ce n’est pas de l’ASCII on le remplace par son code ("&##{c};").
Exemple :

[2] pry(main)> 'Réunion'.unpack('U*').map {|c| (c > 127 ? "&##{c};" : c.chr) }
=> ["R", "&#233;", "u", "n", "i", "o", "n"]

.join => on fusionne le tableau de caractères en une chaîne de caractères.
Exemple :

[3] pry(main)> 'Réunion'.unpack('U*').map {|c| (c > 127 ? "&##{c};" : c.chr) }.join
=> "R&#233;union"

print => on l’écrit dans le fichier

Dernière modification par grim7reaper (Le 24/09/2013, à 17:27)

Hors ligne

#9 Le 24/09/2013, à 17:37

amj

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

J'ai trouvé ceci sur un site

iconv --to-code=ISO-8859-1 --from-code=UTF-8 utf.txt > iso.txt

http://dotbootstrap.x2q.net/howto-conve … -encoding/

wikipédia a écrit :

La norme ISO 8859-1, dont le nom complet est ISO/CEI 8859-1, et qui est souvent appelée Latin-1 ou Europe occidentale

C'est cette norme que tu veux?

Dernière modification par amj (Le 24/09/2013, à 17:39)


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#10 Le 24/09/2013, à 17:40

grim7reaper

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Ça, ça change l’encodage du fichier.
Ça ne remplace pas les caractères par le code HTML correspondant.

Si j’ai bien compris son exemple., ce qu’il veut c’est ça

Dernière modification par grim7reaper (Le 24/09/2013, à 17:41)

Hors ligne

#11 Le 24/09/2013, à 17:41

amj

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

On parle de pdf là non?


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#12 Le 24/09/2013, à 17:42

grim7reaper

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Non, on parle de fichier texte qui va être intégré dans un PDF via pdftk

Valeryan_24 a écrit :

il est indispensable que le fichier txt que l'on donne à traiter à pdftk ne comprenne pas de caractères spéciaux mais leur code Iso.

Hors ligne

#13 Le 24/09/2013, à 17:43

amj

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Ou alors avec la commande iconv mais dans ce cas quel est le format de sortie à préciser ?


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#14 Le 24/09/2013, à 17:50

grim7reaper

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

’k
Bah on verra alors.
Vaut mieux avoir deux solutions que zéro big_smile

Hors ligne

#15 Le 24/09/2013, à 17:57

pingouinux

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Bonjour,
Voici une suggestion en python.

Le script conversion_html.py (Voir la version améliorée en #17)

#!/usr/bin/python3

import sys
dico={ '"' : '&quot;', '&' : '&amp;', '<' : '&lt;', '>' : '&gt;', ' ' : '&nbsp;' }
while True :
   car=sys.stdin.read(1)
   if not car : break
   utf=car.encode('utf-8')
   if car in dico : sys.stdout.write("%s"%dico[car])
   elif len(utf)==1 : sys.stdout.write("%s"%car)
   else :
      uni=car.encode('unicode-internal')
      sys.stdout.write("&#%03d;"%uni[0])

Le fichier de départ fic1

À tester pour voir si ça marche pour tous les caractères,
car je ne suis pas absolument sûr.

Traitement spécial pour '"', '&', '<', '>', ' ' (NO-BREAK SPACE)
./conversion_html.py <fic1 >fic2

Le fichier converti fic2

&#192; tester pour voir si &#231;a marche pour tous les caract&#232;res,
car je ne suis pas absolument s&#251;r.

Traitement sp&#233;cial pour '&quot;', '&amp;', '&lt;', '&gt;', '&nbsp;' (NO-BREAK SPACE)

Édité : Suppression des import inutiles

Dernière modification par pingouinux (Le 24/09/2013, à 18:27)

Hors ligne

#16 Le 24/09/2013, à 18:03

amj

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

grim7reaper a écrit :

’k
Bah on verra alors.
Vaut mieux avoir deux solutions que zéro big_smile

J'en compte 3(+1)
1) sed
2) iconf
3) ruby
3(+1)) python

On peut dire qu'on s'occupe bien de lui big_smile

Dernière modification par amj (Le 24/09/2013, à 18:04)


Vive le logiciel libre !! Articles aléatoires sur Wikipédia sur les logiciels libre, sur linux.

@amj@mastodon.xyz

Hors ligne

#17 Le 24/09/2013, à 18:24

pingouinux

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Voici une version plus concise de mon script en #15.

Le script conversion_html.py amélioré

#!/usr/bin/python3

import sys
dico={ '"' : '&quot;', '&' : '&amp;', '<' : '&lt;', '>' : '&gt;', ' ' : '&nbsp;' }
while True :
   car=sys.stdin.read(1)
   if not car : break
   if car in dico :     sys.stdout.write("%s"%dico[car])
   elif ord(car)<0x80 : sys.stdout.write("%s"%car)
   else :               sys.stdout.write("&#%03d;"%ord(car))

Hors ligne

#18 Le 25/09/2013, à 07:45

Valeryan_24

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Merci à tous pour votre aide, je vais regarder ça et voir quel est le plus simple / efficace à mettre en œuvre.

Pour compléter l'explication : il s'agit effectivement d'un fichier pdf (provenant d'un assemblage de plusieurs documents via Pdftk ou PDF Shuffler, non d'une création directe depuis LibreOffice) sur lequel je veux rajouter des signets.

Il y a la solution PDF Mod, mais ce logiciel, outre qu'il utilise Mono, n'est plus maintenu et il reste de nombreux bugs non corrigés, dont justement l'impossibilité de bouger les signets existants ou d'en rajouter un autrement qu'en dernière position, ne laissant que la contrainte de les réécrire un à un (gênant pour un fichier volumineux), ou Jpdf Bookmarks, en attendant que PDF SPlit & Merge basé sur Sejda soit actualisé.

Bref, avec Pdftk, si on crée un fichier bookmark.txt du type :

BookmarkBegin
BookmarkTitle: Objectifs
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
BookmarkTitle: Synthèse
BookmarkLevel: 1
BookmarkPageNumber: 2

et qu'on l'intègre au pdf cible via la commande :

pdftk filename1.pdf update_info bookmark.txt output filename2.pdf

On obtient un fichier filename2.pdf contenant bien les signets et permettant de naviguer dans Evince.

Sauf que si on laisse "Synthèse" et non "Synth&#232;se" dans bookmark.txt on voit ceci :

Pdftk

D'où ma demande wink

Hors ligne

#19 Le 27/09/2013, à 12:40

Valeryan_24

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Bon, je progresse. Déjà merci encore de m'avoir fait découvrir la commande sed, c'est vraiment puissant mais elle ne semble pas gérer les accents...

Alors j'ai essayé avec la commande tr : elle les prend en compte mais ce n'est toujours pas parfait : si je rentre

tr '[é]' '[&#233;]' < /home/Test.txt > /home/Test2.txt

dans le fichier généré Test2.txt le é n'est remplacé que par &# et non &#233;

Avec :

tr '[é]' '[e]' < /home/Test.txt > /home/Test2.txt

Cette fois le é est replacé par e]

Et :

tr 'é' 'e' < /home/Test.txt > /home/Test2.txt

é est remplacé par ee !

Quelqu'un a une idée pour résoudre ceci ?

Sinon pour mon problème d'origine avec pdftk, j'ai trouvé tout simplement la solution pour m'éviter cette étape de transformation de caractères spéciaux, c'est en utilisant la commande update_info_utf8 au lieu de update_info :

pdftk filename1.pdf update_info_utf8 bookmark.txt output filename2.pdf

Aussi bien sur Linux que Windows, avec Evince / Okular / Adobe Reader a priori c'est bon, le signet est bien écrit correctement avec l'accent.

Mais j'aimerais bien comprendre - cela peut servir - le souci de sed / tr avec les accents smile

Pour le script python de pingouinux, j'ai essayé, je le crée dans gedit, l'enregistre en conviso.py et le rends exécutable, mais ensuite lorsque je l'exécute :

./conviso.py < /home/Test.txt > /home/Test2.txt

j'obtiens le message d'erreur suivant :

bash: ./conviso.py: Aucun fichier ou dossier de ce type

Dernière modification par Valeryan_24 (Le 27/09/2013, à 15:33)

Hors ligne

#20 Le 27/09/2013, à 14:06

Hizoka

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

perso je me suis fait un sed : http://forum.ubuntu-fr.org/viewtopic.php?id=1313891
Sinon j'avais fait avec Lapogne71 2 scripts qui renomme les fichiers ayant des soucis d'accents (tu peux toujours regarder les codes) : http://forum.ubuntu-fr.org/viewtopic.php?id=347517


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#21 Le 27/09/2013, à 15:32

Valeryan_24

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Excellent, il y a vraiment toutes les occurences !

Bon, avec l'aide de Hizoka et amj, si j'essaie :

sed -e 's/è/&#232;/g' -i fichier.txt

Cette fois cela prend bien en compte les accents, mais au lieu de remplacer è par &#232; sed me rajoute #232; après è :

è#232; et le & a disparu !

Je dois donc oublier un paramètre...

Dernière modification par Valeryan_24 (Le 27/09/2013, à 15:34)

Hors ligne

#22 Le 27/09/2013, à 15:51

pingouinux

Re : Convertir les caractères spéciaux d'un fichier texte en code Iso

Salut,
C'est

sed -e 's/è/\&#232;/g' -i fichier.txt

Hors ligne