#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
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 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
#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 ou awk
sed 's/<regexp>/<remplacement>/' <fichier>
donc par exemple
sed 's/é/é\;/' <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 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.
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 é : 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
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/è/è/' 's/é/é/' -i fichier.txt
presque
plutôt
sed -e 's/è/è\;/;s/é/é\;/' -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
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.
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", "é", "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é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/
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.
Hors ligne
#10 Le 24/09/2013, à 17:40
- grim7reaper
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.
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
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.
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
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={ '"' : '"', '&' : '&', '<' : '<', '>' : '>', ' ' : ' ' }
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
À 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)
É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
’k
Bah on verra alors.
Vaut mieux avoir deux solutions que zéro
J'en compte 3(+1)
1) sed
2) iconf
3) ruby
3(+1)) python
On peut dire qu'on s'occupe bien de lui
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.
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={ '"' : '"', '&' : '&', '<' : '<', '>' : '>', ' ' : ' ' }
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èse" dans bookmark.txt on voit ceci :
D'où ma demande
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 '[é]' '[é]' < /home/Test.txt > /home/Test2.txt
dans le fichier généré Test2.txt le é n'est remplacé que par &# et non é
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
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/è/è/g' -i fichier.txt
Cette fois cela prend bien en compte les accents, mais au lieu de remplacer è par è 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/è/\è/g' -i fichier.txt
Hors ligne