Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails)

#1 Le 15/11/2012, à 10:44

adryen31

Iconv UTF-8 sans bom

Bonjour tout le monde,

voilà mon soucis j'ai une arborescence de 1975 dossiers/fichiers à convertir en UTF-8 sans bom
s'ils ne le sont pas déjà. Hors j'ai réalisé ce petit script, pour info je le lance avec cygwin (et oui
malheureusement les fichiers sont sur un Windows ...).

#!/bin/bash
FROM=iso-8859-1
TO=UTF-8
ICONV="iconv -f $FROM -t $TO"
# Convert
find Nouveau/ -type f -name "*" | while read fn;
do
cp ${fn} ${fn}.bak
$ICONV < ${fn}.bak > ${fn}
rm ${fn}.bak
cp ${fn} ${fn}.bak
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' < ${fn}.bak > ${fn}
done

Pensez-vous que cela face correctement ce que je veux ? Car de plus en le lançant j'ai l'erreur
suivante:

ToUtf82.txt: line 13: Erreur de syntaxe près du symbole inattendu « done »
ToUtf82.txt: line 13: `done'

Désolé pour mon incompétence en script, mais c'est mon premier tongue donc commencer un script
avec du awk, iconv, et du cygwin  ... je misère un peu

Merci beaucoup en tout cas.

Adryen 31

Hors ligne

#2 Le 15/11/2012, à 11:17

pingouinux

Re : Iconv UTF-8 sans bom

Bonjour,
Je n'arrive pas à reproduire ton erreur.
Il faut mettre les noms de fichiers entre " ", au cas où ils contiendraient des espaces.
Ton script peut se simplifier comme ceci :

#!/bin/bash
FROM=iso-8859-1
TO=UTF-8
ICONV="iconv -f $FROM -t $TO"
# Convert
find Nouveau -type f | while read fn;
do
   $ICONV "$fn" > "$fn".bak
   awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' "$fn".bak > "$fn"
done

Édité : Orthographe

Dernière modification par pingouinux (Le 19/11/2012, à 09:42)

En ligne

#3 Le 15/11/2012, à 11:23

adryen31

Re : Iconv UTF-8 sans bom

Merci beaucoup super, par contre même problème maintenant

$ sh ToUtf82.sh
ToUtf82.sh: line 10: Erreur de syntaxe près du symbole inattendu « done »
ToUtf82.sh: line 10: `done'

Peut-être qui faut un truc a la fin du fichier pour cygwin ...

Hors ligne

#4 Le 15/11/2012, à 11:34

pingouinux

Re : Iconv UTF-8 sans bom

Ton script est un fichier bash, il vaut mieux ne pas le lancer avec sh.

/chemin_du_script/ToUtf82.sh

Même en le lançant avec sh, je ne reproduis pas l'erreur. As-tu des fichiers avec des noms exotiques ?

En ligne

#5 Le 15/11/2012, à 11:37

adryen31

Re : Iconv UTF-8 sans bom

ok j'ai trouvé :

his is a common error and the reason is your are using Windows to create the file. Thus the line break is \r\n rather than \n.

All you need to do is change the format using a system command:

dos2unix filename_here

^^ je regarde du coup le resultat

Hors ligne

#6 Le 15/11/2012, à 11:49

adryen31

Re : Iconv UTF-8 sans bom

arf mince j'ai essayé avec le rm mais cela ne fonctionne pas de supprimer le .bak

#!/bin/bash
FROM=iso-8859-1
TO=UTF-8
ICONV="iconv -f $FROM -t $TO"
# Convert
find Nouveau -type f | while read fn;
do
   $ICONV "$fn" > "$fn".bak
   awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' "$fn".bak > "$fn"
   rm "$fn".bak
done

Hors ligne

#7 Le 15/11/2012, à 11:52

adryen31

Re : Iconv UTF-8 sans bom

Si autant pour moi je n'avais pas recompilé avec dos2unix

Merci beaucoup smile

Hors ligne

#8 Le 15/11/2012, à 11:57

adryen31

Re : Iconv UTF-8 sans bom

arf non mes fichier sont converti en :

$ file -i *

AddWorkflowToSessionAction.java:          text/plain; charset=us-ascii
GenerateWorkflowGraphAction.java:         text/plain; charset=us-ascii
GetWorkflowGraphAction.java:              text/plain; charset=us-ascii
GetWorkflowInitializerDataAction.java:    text/plain; charset=us-ascii
GetWorkflowListOfExtFobFieldsAction.java: text/plain; charset=us-ascii
GetWorkflowListOfStatusAction.java:       text/plain; charset=us-ascii
GetWorkflowStatusAction.java:             text/plain; charset=us-ascii

sad même pas utf-8

Hors ligne

#9 Le 15/11/2012, à 12:07

pingouinux

Re : Iconv UTF-8 sans bom

Pour avoir la liste des codages de caractères :

iconv -l

Il semblerait que ce ne soit pas iso-8859-1, mais ISO-8859-1.
Sinon, je peux tester sur un de tes fichiers, s'il est petit et non confidentiel.

En ligne

#10 Le 15/11/2012, à 12:30

adryen31

Re : Iconv UTF-8 sans bom

mince il y a pas moyen de lui faire prendre les 2 ... car j'ai du us-ascii en plus

Hors ligne

#11 Le 15/11/2012, à 12:52

pingouinux

Re : Iconv UTF-8 sans bom

Tu peux éventuellement récupérer le codage du fichier dans la boucle :

FROM=$(file -bi "$fn" | sed 's/^.*=//')
FROM="${FROM^^}"   # Pour tout mettre en majuscules

En ligne

#12 Le 15/11/2012, à 13:55

adryen31

Re : Iconv UTF-8 sans bom

Super, sauf qu'il chope un :

SyncSource.java:                        text/plain; charset=unknown-8bit
SyncUser.java:                          text/plain; charset=iso-8859-1
Task.java:                              text/plain; charset=unknown-8bit
UserAlreadySynchronizingException.java: text/plain; charset=iso-8859-1

et pour le unknown-8bit il plante et me file de fichier ... grrr

Hors ligne

#13 Le 15/11/2012, à 14:53

pingouinux

Re : Iconv UTF-8 sans bom

Dans la boucle, après avoir calculé FROM pour le fichier, tu peux sauter le traitement si l'encodage ne convient pas :

[[ ( $FROM != "ISO-8859-1" ) && ( $FROM != "US-ASCII" ) ]] && continue

En ligne

Haut de page ↑