IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Encodage de fichier Java, transmission Windows vers Unix


Sujet :

Langage Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2005
    Messages : 265
    Points : 178
    Points
    178
    Par défaut Encodage de fichier Java, transmission Windows vers Unix
    1) Pour bien encoder mon fichier en ascii, est-ce le code suivant n'est pas suffisant? (je reste en utf8 sans bom)
    comment préciser de façon systématique et sûre?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            File fichier = new File("toto.txt");
            System.setProperty("file.encoding","US-ASCII");
            // fichier ouvert en mode append
            try {
                final BufferedWriter out = new BufferedWriter(new FileWriter(
                        fichier));


    2) autre question, je génère un fichier qui est ensuite transmis dans un système unix,
    est-ce que mon code ci-dessous est adapté?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            out.write(chaineEnregistrementTraite);
            out.newLine();
    Quels sont les risques? Avez-vous des solutions?


  2. #2
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    12 288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 12 288
    Points : 20 797
    Points
    20 797
    Par défaut
    Citation Envoyé par batou22003 Voir le message
    1) Pour bien encoder mon fichier en ascii, est-ce le code suivant n'est pas suffisant? (je reste en utf8 sans bom)
    comment préciser de façon systématique et sûre?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Path path = Paths.get("toto.txt");
    try(Writer writer = Files.newBufferedWriter(path, StandardCharsets.US_ASCII)) {
     
    }
    Ceci étant dit, quand un fichier est en ASCII, il est identique au même fichier en utf-8 sans bom, forcément. C'est un peu ce qui a fait le succès d'utf-8.

    Citation Envoyé par batou22003 Voir le message
    2) autre question, je génère un fichier qui est ensuite transmis dans un système unix,
    est-ce que mon code ci-dessous est adapté?
    Comme le dit un grand maître Pandaren,

    ... Ce n'est peut-être pas... La bonne question.

    Le code adapté, est celui qui produit le fichier adapté. Le fichier est adapté s'il est tel qu'il doit être pour marcher.
    Un fichier se fiche complètement de s'il est sur Windows, Unix ou Zerfslt (l'OS multiversel zorblaxien.) Il se fiche complètement de s'il est transféré de l'un à l'autre.

    Ce que tu dois faire, c'est regarder à quoi doit ressembler ton fichier pour marcher.
    Et ton code Java doit faire en sorte que ce fichier soit tel qu'il doit être.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 813
    Points
    48 813
    Par défaut
    Et pour info, ceci n'a aucun effet il me semble:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.setProperty("file.encoding","US-ASCII");
    Cette propriété n'est lue qu'au démarrage de la JVM, plus après.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2005
    Messages : 265
    Points : 178
    Points
    178
    Par défaut encodage
    Merci pour vos réponses.

    Je vais tester ce code. Je me demande également si je ne risque pas d'avoir des problèmes d'accents avec l'ASCII. Je m'excuse encore de mes questions, je ne m'y connais pas beaucoup en encodage. Et en utf8 sans bom, les accents passent?

  5. #5
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 938
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Le code adapté, est celui qui produit le fichier adapté. Le fichier est adapté s'il est tel qu'il doit être pour marcher.
    Un fichier se fiche complètement de s'il est sur Windows, Unix ou Zerfslt (l'OS multiversel zorblaxien.) Il se fiche complètement de s'il est transféré de l'un à l'autre.
    En plus de l'encodage, il y a quand même une différence sur les fins de ligne, représenté par "\n" ou "\r\n" selon les systèmes.

    La méthode newLine() du BufferedReader écrit la fin de ligne du système hôte...

    Citation Envoyé par batou22003 Voir le message
    Je vais tester ce code. Je me demande également si je ne risque pas d'avoir des problèmes d'accents avec l'ASCII. Je m'excuse encore de mes questions, je ne m'y connais pas beaucoup en encodage. Et en utf8 sans bom, les accents passent?
    Heu... Il n'y a pas d'accents en ASCII !!!

    Sinon l'UTF-8 te permet de représenter tous les caractères.
    Le BOM ne rentre pas en compte (c'est juste un marqueur permettant de faciliter la reconnaissance de l'encodage du fichier).


    a++

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2005
    Messages : 265
    Points : 178
    Points
    178
    Par défaut encodage
    L'ascii ne supporte pas les accents.

    Peut -etre que je m'inquiète pour rien, le client pour qui je développe le fichier utilisé par leur programme a écrit plusieurs fois sur ses documents encodage ASCII .
    J'essaie d'anticiper sur les problèmes d'encodage pouvant intervenir , dans le cas où il me confirme que l'encodage est uniquement en ASCII.
    Je lui demande également de confirmer si l'encodage utilisé par son programme supporte les accents.
    Et si il n'est pas contraint par son environnement pour la lecture des passages à la ligne d'un fichier généré par Windows. En effet, je ne sais pas comment ils vont lire notre fichier.


    Merci encore de votre aide.

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 813
    Points
    48 813
    Par défaut
    en très gros en ASCII, tu aura les lettres, les chiffres, la ponctuation, les différentes types de parenthèses.


    https://en.wikipedia.org/wiki/ASCII#...ble_code_chart

    l'ascii c'est du 7bits.

    Vérifie quand même que ton client raconte pas de conneries. Beaucoup de gens confondent ascii et "ascii étendu". Le premier est un encodage, le deuxième un miriades d'encodages différents suivant le pays et l'os. Toute la série des ISO-8859-XX rentrent dans la catégories des ascii étendus. Toute la série des code page windows aussi.

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2005
    Messages : 265
    Points : 178
    Points
    178
    Par défaut encodage
    le code donné ne fonctionne pas en 1.6, c'est du 1.7

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Path path = Paths.get("toto.txt");
    try(Writer writer = Files.newBufferedWriter(path, StandardCharsets.US_ASCII)) {
     
    }
    J'ai un autre contructeur dans lequel je peux mettre de l'encodage mais c'est plus du java.io :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    com.ibm.ws.webservices.utils.BufferedWriter(out, os, enc)
    Que me conseillez vous d' utiliser pour préciser l'encodage pour un fichier texte simple à générer? J'y écris des chaine puis je fais des retour à la ligne?


  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 813
    Points
    48 813
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    java.io.OutputStream os  = ...
    java.io.Writer writer = new java.io.OutputStreamWriter(os,"US-ASCII");
    java.io.BufferedWriter bw = new java.io.BufferedWriter(writer);
    En n'oubliant pas les 3 try, finally pour tout le nettoyage.
    Aussi, tu devrais éviter une java aussi vieille que 1.6 pour de nouveaux projets.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2005
    Messages : 265
    Points : 178
    Points
    178
    Par défaut encodage
    Comment j'initialise le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.io.OutputStream os  = ...
    pour qu'il me crée un fichier nommé "toto.txt"

    avant j'avais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    File fichier = new File("toto.txt");

  11. #11
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 813
    Points
    48 813
    Par défaut
    FileOutputStream

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2005
    Messages : 265
    Points : 178
    Points
    178
    Par défaut encodage
    j'ai eu l'info complète, c'est du iso latin 15.

    Du coup, j'ai écris le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	File fichier = new File("monfichier.txt");
     
     
    			BufferedWriter out=null;
    			try {
    				out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fichier), "ISO8859_15"));
    			} catch (UnsupportedEncodingException e1) {
    				System.out.println("format non supporté");
    				//e1.printStackTrace();
    			} catch (FileNotFoundException e1) {
    				System.out.println("fichier non trouvé");
    				//e1.printStackTrace();
    			}
    Quand j'ouvre le fichier sous Notepad++, il me dit que c'est du ANSI, mais bon.
    A prioris le code ISO8859_15 semble etre le bon. Il semble que l'exception, unsupportedEncodingException soit jamais détectée. J'ai
    mis des codes bidons, et ca plante uniquement à l'écriture.

    Reste la question du retour à la ligne. Je génère des fichiers qui seront lus sous Unix.
    Pour les retour à la ligne que dois-je mettre ?

    actuellement je fais un out.newLine();

    Dois-je faire un truc du genre out.write("\n") pour être bien?

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    12 288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 12 288
    Points : 20 797
    Points
    20 797
    Par défaut
    Citation Envoyé par batou22003 Voir le message
    Quand j'ouvre le fichier sous Notepad++, il me dit que c'est du ANSI, mais bon.
    Il n'a aucun moyen de faire la différence, en fait. Ça ne concerne que des caractères comme € ou œ, tu les auras pas souvent.

    Citation Envoyé par batou22003 Voir le message
    A priori le code ISO8859_15 semble être le bon.
    Il fera bien l'affaire, oui.

    Citation Envoyé par batou22003 Voir le message
    Reste la question du retour à la ligne. Je génère des fichiers qui seront lus sous Unix.
    Pour les retour à la ligne que dois-je mettre ?

    actuellement je fais un out.newLine();

    Dois-je faire un truc du genre out.write("\n") pour être bien?
    Comme l'a dit adiGuba, out.newLine() se comporte différemment en fonction du système sur lequel ton programme Java tourne.
    Si le fichier à créer est pour Unix et ça ne dépend de rien du tout, alors elle n'est pas adaptée.
    Il faut bien out.write("\n") . C'est en général l'usage pour les fichiers spécifiques Unix. Mais pour tout ce qui est fichiers modernes, cette différence de systèmes est obsolète depuis longtemps. La bonne c'est celle du fichier, ça n'a rien à voir avec le système. Et pour un fichier CSV par exemple, on se fiche royalement de s'il va être lu sur du Unix. Ce qui compte c'est ce que veut le programme qui va le lire.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 813
    Points
    48 813
    Par défaut
    Je suis étonné que tu n'aie pas un UnsupportedEncodingException lancé, le nom correct est normalement "ISO-8859-15"

  15. #15
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    12 288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 12 288
    Points : 20 797
    Points
    20 797
    Par défaut
    Java accepte les alias, et ceci en est un.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre habitué
    Profil pro
    Inscrit en
    décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2005
    Messages : 265
    Points : 178
    Points
    178
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Je suis étonné que tu n'aie pas un UnsupportedEncodingException lancé, le nom correct est normalement "ISO-8859-15"
    Oui, mais j'utilise un constructeur OutputStreamWriter() de java.io et pas java.nio.
    Le nom d'encodage est ISO-8859-15 pour nio et ISO8859_15 pour java.io.OutputStreamWriter

  17. #17
    Modérateur

    Profil pro
    Inscrit en
    septembre 2004
    Messages
    12 288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2004
    Messages : 12 288
    Points : 20 797
    Points
    20 797
    Par défaut
    Citation Envoyé par batou22003 Voir le message
    Oui, mais j'utilise un constructeur OutputStreamWriter() de java.io et pas java.nio.
    Le nom d'encodage est ISO-8859-15 pour nio et ISO8859_15 pour java.io.OutputStreamWriter
    Non, ils obéissent aux mêmes règles.
    ISO8859_15 est simplement l'un des nombreux alias de ISO-8859-15. Demander l'un ou l'autre fournira la même chose.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  18. #18
    Membre habitué
    Profil pro
    Inscrit en
    décembre 2005
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2005
    Messages : 265
    Points : 178
    Points
    178
    Par défaut
    merci. Effectivement c'est un alias, j'arrive à passer les 2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    File fichier = new File("toto.txt");
    		OutputStream monOut = null;
    		try {
    			monOut = new FileOutputStream(fichier);
    		} catch (FileNotFoundException e2) {
    			System.out.println("Impossible de créer le fichier");
    		}
     
    	//ISO8859_15 ou ISO-8859-15
    		BufferedWriter out=null;
    		try {
    				out = new BufferedWriter(new OutputStreamWriter(monOut, "ISO8859_15"));
    		} catch (UnsupportedEncodingException e1) {
    			System.out.println("Format non supporté");
    			//e1.printStackTrace();
    		} 
                    ...
                   try{
    		out.write("\n");
                    out.close();
                   } ...
    Le fichier est bien généré, merci de votre aide. Je passe le sujet en résolu.


  19. #19
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : avril 2007
    Messages : 25 481
    Points : 48 813
    Points
    48 813
    Par défaut
    N'oublie quand même pas de gérer correctement tes fermetures de flux hein

  20. #20
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : avril 2002
    Messages : 13 938
    Points : 23 015
    Points
    23 015
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    N'oublie quand même pas de gérer correctement tes fermetures de flux hein
    Et virer tous ces try/catch inutile et incorrect.

    Si tu veux traiter l'exception il faut utiliser un seul try/catch qui englobe le tout...


    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment convertir des fichiers texte Windows vers Unix
    Par hornetbzz dans le forum Contribuez
    Réponses: 17
    Dernier message: 11/02/2014, 14h46
  2. Réponses: 1
    Dernier message: 26/03/2010, 13h11
  3. Portage Windows vers Unix
    Par ouamtax dans le forum Bibliothèques
    Réponses: 4
    Dernier message: 03/01/2008, 10h10
  4. FTP DE WINDOWS VERS UNIX
    Par noznoz78 dans le forum ASP
    Réponses: 1
    Dernier message: 29/03/2006, 22h06
  5. [Linux]différence de code de windows vers unix sous eclipse
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 05/01/2005, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo