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

Entrée/Sortie Java Discussion :

[Encoding][String] remplacement de caractères ISO 8859-2


Sujet :

Entrée/Sortie Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 23
    Points
    23
    Par défaut [Encoding][String] remplacement de caractères ISO 8859-2
    Le but est de lire un fichier encodé en ISO 8859_2.
    Ca, a priori pas de problème.

    Ensuite il faut remplacer des caractères spécifiques à l'ISO 8859_2 par des caractères ISO 8859_1 non accentués : là çà coince malgré pas mal de manips (manipulations de tableaux de bytes, des String directement, avec ou sans des variables char, avec ou sans le codage des caractères en unicode type '\uXXXX', string.replace(), etc...).

    Pour finalement enregistrer ça en ISO 8859_1, ce qui marche a priori.

    Le code actuel est le suivant, avec la partie volontairement manquante de remplacement de caractères qui ne marche de toute manière pas.. :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    	public static void convertFile(String pathInputFile, String pathOutputFile, String fromEncoding, String toEncoding)
    	{
     
    		try {
    		    InputStream in = new FileInputStream(pathInputFile);
    		    OutputStream out = new FileOutputStream(pathOutputFile);
     
    		    String from = fromEncoding;		    
    		    String to = toEncoding;
     
    		    InputStreamReader iptBis = new InputStreamReader(in, from);
    		    System.out.println("encodage en lecture : " + iptBis.getEncoding());
    		    Reader r = new BufferedReader(iptBis);
     
    		    OutputStreamWriter optBis = new OutputStreamWriter(out, to);
    		    System.out.println("encodage en écriture : " + optBis.getEncoding());
    		    Writer w = new BufferedWriter(optBis);
     
    		    char[] buffer = new char[4096];
    		    int len;
    		    while((len = r.read(buffer)) != -1) { 
    				// ICI on doit effectuer la conversion des caractères incorrectes
    		    	}
    		    	w.write(buffer, 0, len);
    		    }
     
    		}
    		catch(FileNotFoundException fnfe) {
          		System.out.println("convertFile FileNotFoundException ****** ERREUR GRAVE DU BATCH : "+ fnfe.toString());
    			fnfe.printStackTrace();
    		}
    		catch(UnsupportedEncodingException uese) {
          		System.out.println("convertFile UnsupportedEncodingException ****** ERREUR GRAVE DU BATCH : "+ uese.toString());
    			uese.printStackTrace();
    		}
    		catch(IOException ioe) {
          		System.out.println("convertFile IOException ****** ERREUR GRAVE DU BATCH : "+ ioe.toString());
    			ioe.printStackTrace();
    		}
    	}
    Des idées sur le sujet pour faire le remplacement de ces foutus caractères ?

  2. #2
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    Bonjour,

    Une méthode simple est de crééer un tableau de correspondance entre les caractères ISO-8859-2 et les caractères non accentués ISO-8859-1.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 23
    Points
    23
    Par défaut
    Effectivement, mais là n'est pas le problème en fait.

    C'est vraiment l'action de remplacer un caractère ISO 8859-2 par un caractère ISO 8859-1 qui ne marche pas.

    Un exemple qui ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = str2.replace('\u0142', '\u0069');
    Et concrètement le remplacement n'est pas fait... Très énervant...

    Par contre si vous tentez de remplacer un caractère ISO de base (<128), ç amarche... :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = str2.replace('\u0046', '\u0066');

  4. #4
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Points : 1 996
    Points
    1 996
    Par défaut
    le caractère '\u066' correspond au caractère #66 (0x42) de l'unicode soit le b majuscule 'B'.

    Donc tu désires remplacer le caractère unicode '\u0142' <controle: SINGLE SHIFT TWO>0x8E par le caractère '\u0069' le e majuscule 'E'?

    Je ne pense pas

    Il faut que tu travaille avec seulement en unicode dans ton programme java.

    En lisant ton fichier 'ISO-8859-2', java transforme les caractères ISO-8859-2 en Unicode. Java traite les strings en Unicode. Quand tu écris dans ton fichier 'ISO-8859-1', java convertira les codes des caractères unicode en leur code 'ISO-8859-2'.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 21
    Points : 23
    Points
    23
    Par défaut
    Effectivement, j'ai finalement forcé la lecture systématique en format "Unicode" pour ensuite seulement tenté les remplacement de caractères.
    Qui du coup marchent.

    Le bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputStreamReader iptBis = new InputStreamReader(in, from);
    Devient alors (poru que ça marche) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputStreamReader iptBis = new InputStreamReader(in, "Unicode");
    JAVA semble s'occuper de faire sa patouille de correspondances de codes ISO / Unicode etc.

    Tout est bien qui finit bien !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/06/2015, 19h17
  2. [Python 3.X] Afficher un caractère ISO 8859-1 sur debian (console)
    Par JokerAs dans le forum Général Python
    Réponses: 1
    Dernier message: 18/11/2014, 12h39
  3. [grep] Rechercher un caractère ISO 8859-1
    Par sempire dans le forum Applications et environnements graphiques
    Réponses: 1
    Dernier message: 04/07/2010, 19h59
  4. Kettle : Caractéres encoding ISO-8859-15
    Par titouni dans le forum kettle/PDI
    Réponses: 0
    Dernier message: 23/04/2009, 17h41
  5. caractères ISO-8859-1 en console sur XP
    Par Thierry Chappuis dans le forum Windows
    Réponses: 3
    Dernier message: 14/12/2005, 13h13

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