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

API standards et tierces Java Discussion :

Creer un fichier en UTF-8


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 99
    Par défaut Creer un fichier en UTF-8
    Bonjour j'ai un problème d'écriture dans un fichier en UTF-8. En effet, mon programme est sensé créer un fichier en UTF-8 or dans notepad++, le menu "encoding" ne montre aucun format.
    Mon programme lit bien un fichier source en encoding UTF-8 (comme spécifié par mon notepad++), il lit le contenu de ce fichier dans une string et doit le recopier dans un autre fichier préalablement crée en uTF-8 aussi.
    Mais rien a faire, le contenu du fichier cible est bizarre (je parle des character encodés comme \uFFFD):


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    num_compte = 3 06 3 005 386 056\r\n\r\n
    num_facture = 13 418 979 009\r\n\r\n
    montant_total_ttc = Total TTC 181,91 \uFFFD\r\nA r\uFFFDgler avant le 01/03/2010
    num_client = 1 0009571 52\r\n\r\n




    Mon code :
    Code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
       1. System.setProperty( "file.encoding", "UTF-8" );
       2. PropertiesConfiguration lProps = new PropertiesConfiguration();
       3.  List<String> lOCRContentList = new ArrayList<String>();
       4.  Map<String, String> lPropsMap = new HashMap<String, String>();
       5. ...
       6. String lOCRContentStr = FileUtils.readFileToString( new File(
       7.     lOutputTextFullPathFilename ), "UTF-8" );
       8.   lPropsMap.put( lName, lOCRContentStr );
       9. ...
      10. Writer lPropsFile = new BufferedWriter( new OutputStreamWriter(
      11.    new FileOutputStream( pOutputPropsFullPathFilename ),
      12.    Charset.forName( "UTF-8" ) ) );
      13.  lProps.setHeader( "my interesting comment" );
      14.  lProps.save( lPropsFile );



    Que proposez-vous comme code ?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 99
    Par défaut
    Tiens je viens d'essaier un autre truc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PropertiesConfiguration lProps = new PropertiesConfiguration();
    ...
    lProps.save( new FileOutputStream( pOutputPropsFullPathFilename ),
    				"UTF-8" );
    Le fichier de nom absolue pOutputPropsFullPathFilename crée est en ASCII selon notepad++ et même selon linux ubuntu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    alfresco33g@alfrescodemo:~$ file edf-300dpi-bw.properties
    edf-300dpi-bw.properties: ASCII text, with CRLF line terminators
    Décidément, impossible de créer un fichier au format UTF-8

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    le fichier est bien au format utf-8. Si ce sont le \r qui t'ennuie, il faut bien les échapper d'une manière ou d'une autre puisque, dans un fichier properties, les retour à la ligne on une signification particulière. De même, comme indiqué dans la javadoc, PropertiesConfiguration fait un echappement de tout caractère qui ne sois pas latin1.

    Quand à l'ascii, par définition, c'est aussi de l'utf-8 puisque les 127 caractère de base de l'ascii sont mappé avec les même valeur en utf-8.

  4. #4
    Membre éprouvé
    Avatar de _skip
    Homme Profil pro
    Développeur d'applications
    Inscrit en
    Novembre 2005
    Messages
    2 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur d'applications
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 898
    Par défaut
    Je trouve que trifouiller les propriétés système est super moche pour faire ça. Pourquoi ne pas créer un writer utf-8 à la place?

    Perso j'ai cette fonction dans ma boîte à outil pour ce faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /**
         * Creates and returns a buffered writer for writing UTF-8 encoded files.
         * The caller is responsible for closing the writer.
         *
         * @param fileToWrite The file name to open / create.
         * @param append Setting this param to false overwrites the file.
         * @return A buffered writer.
         * @throws IOException In case of IO errors.
         */
        public static BufferedWriter createBufferedWriterUTF8(String fileToWrite, boolean append) throws IOException
        {
            return new BufferedWriter( new OutputStreamWriter( new FileOutputStream(fileToWrite, append), CharEncoding.UTF_8) );
        }

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 99
    Par défaut
    Merci pour les explications.
    En fait, je vais poser mon problème plus généralement car je galère trop là .

    En entrée, j'ai un fichier de type texte (présent sur le disque) avec le contenu suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Total TTC 181,91 €
    A régler avant le 01/03/2010
    On remarque que ce contenu est parfait sur le symbole € et les accents. De plus il est au format UTF-8 d'après mon notepad++ et la commande 'file' de ubuntu.

    Très concrètement je cherche à :

    1) Lire le contenu de ce fichier
    2) Crée un fichier xxx.properties au format UTF-8 (tout comme le fichier d'entrée).
    3) Ecrire dans le fichier xxx.properties le même contenu que le fichier d'entrée avec des choses en plus (notamment la clé de la valeur).

    Et ben pour avoir un fichier xxx.properties en sortie "identique" au fichier d'entrée, j'ai du mal

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    tu ne pourra pas avec les classes de type propertiesConfiguraiton, puisqu'elles obéissent à des règle particulière, documentées dans la javadoc, et qui, semble-t-il, te posent problème. Dans ton cas le mieux est de le faire à la main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    String[] lignes = ....
    String[] cles = ...
    Writer w = ......;
    int index = 0;
    for (String ligne: lignes){
      writer.write(cles[i++]);
      writer.write(" = ");
      writer.write(ligne);
      writer.write("\n");
    }

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 99
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    le fichier est bien au format utf-8. Si ce sont le \r qui t'ennuie, il faut bien les échapper d'une manière ou d'une autre puisque, dans un fichier properties, les retour à la ligne on une signification particulière. De même, comme indiqué dans la javadoc, PropertiesConfiguration fait un echappement de tout caractère qui ne sois pas latin1.

    Quand à l'ascii, par définition, c'est aussi de l'utf-8 puisque les 127 caractère de base de l'ascii sont mappé avec les même valeur en utf-8.
    C'est donc pour ça que mon symbole euro est tout bizarre...moi je veux un vrai caractère lisible de préférence...comment se fait-il que mon editeur de texte ne converti pas ce symbole au format unicode en caractère lisible ?

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par zomurn Voir le message
    C'est donc pour ça que mon symbole euro est tout bizarre...moi je veux un vrai caractère lisible de préférence...comment se fait-il que mon editeur de texte ne converti pas ce symbole au format unicode en caractère lisible ?
    parce que cet échappement est spécifique au format des fichier properties et ce n'est pas l'affaire de ton éditeur.

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 99
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    parce que cet échappement est spécifique au format des fichier properties et ce n'est pas l'affaire de ton éditeur.
    Oulala, ça m'embrouille tout ça. Tu veux dire que dans un fichier .properties, les symboles d'encodage d'un jeu de caractère quelconque est différent ? (dans ce cas pas la peine de consulter une table de conversion).
    Je croyais qu'un fichier .properties était un fichier .txt avec un contenu respectant des règles de syntaxe....pas d'encodage.

    En fait je voulais utiliser PropertiesConfiguration pour éviter de faire le bout de code que tu as écris (programmation bas niveau). Mais je crois que je vais rayer cette classe....à moins que mon programme qui lira ce fichier .properties généré le lira comme il faut (qu'il comprenne le symbole euros, etc.), c'est sûr ça ?

Discussions similaires

  1. Creer un fichier encoder en utf-8
    Par erehcab dans le forum Langage
    Réponses: 0
    Dernier message: 02/11/2011, 16h39
  2. [File][UTF-16]comment creer un fichier xml en utf-16?
    Par Invité dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 10/01/2006, 15h40
  3. creer un fichier cpl
    Par Louis-Guillaume Morand dans le forum Windows
    Réponses: 5
    Dernier message: 04/03/2004, 19h10
  4. Réponses: 19
    Dernier message: 24/05/2002, 16h36
  5. [langage] comment créer des fichiers ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2002, 16h33

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