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 :

Ecrire dans un fichier une chaine du genre "\u062e\u0639\u062a\u0627\u0631\u0624"


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut Ecrire dans un fichier une chaine du genre "\u062e\u0639\u062a\u0627\u0631\u0624"
    Bonjour,

    Je lis un fichier écrit en code unicode de l'Arabe (du genre : \u062d\u062e\u0639\u062a\u0627\u0631\u0624\u0635). Tout se passe bien. Je finis mon traitement puis je souhaite écrire la chaîne que j'ai lue dans un autre fichier. Je ne veux pas que java interprète l'unicode et me l'écrive en arabe mais je souhaite garder la forme \u062d\u062e\u0639\u062a\u0627\u0631\u0624\u0635. Je n'arrive pas à trouver comment obliger java à m'écrire cette chaine comme elle est et non pas l'interpreter et l'écrire en arabe. Une idée ?

    J'ai essayé d'appliquer un replaceAll("\\", "\\\\") sur la chaine avant de l'écrire dans le fichier, mais j'ai eu des erreurs d'execution lié au regex. J'ai essayé avec un replaceAll("\\\\", "\\\\\\"), je n'ai pas eu d'erreurs mais j'ai continué à écrire en arabe.

    J'espere que quelqu'un puisse m'aider.

    Merci

  2. #2
    Membre Expert
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 052
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 052
    Par défaut
    Salut,

    Enregistre ton fichier avec le Charset de l'unicode : modifier l'encodage

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Comment tu lis ce fichier ? Car par défaut Java n'interprète pas cela lorsque tu lis un fichier (ce n'est le cas que pour le compilateur et les fichiers *.properties).

    Donc cela signifie que tu dois avoir un traitement qui convertie les \u0000 en vrai caractère Unicode. Du coup lorsque tu écris dans un fichier il écrit directement les caractères.

    Ton remplacement des anti-slash ne peut pas marcher, car le contenu en mémoire ne contient plus de \u0000 mais directement le caractère correspondant (il est toutefois utile si d'autre anti-slash sont présent dans la chaine).


    Il te faut donc convertir les caractères non-ASCII en séquence unicode AVANT d'écrire le fichier. Tu peux faire cela via les regexp :
    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
    	/**
             * Retourne un caractère encodé en \u0000
             */
    	private static String encoded(int c) {
    		return String.format("\\u%04x", c);
    	}
     
    	/**
             * Encode tous les caractères NON-ASCII d'une chaine
             */
    	public static String encoded(String input) {
    		// On double les anti-slash déjà présent :
    		input = input.replaceAll("\\\\", "\\\\\\\\");
     
    		// On recherche tous les caractères non-ASCII
    		Pattern pattern = Pattern.compile("[^\\p{ASCII}]");
    		Matcher matcher = pattern.matcher(input);
    		if (matcher.find()) {
    			// Si on trouve au moins un caractère, on travaille avec une chaine temporaire :
    			StringBuffer sb = new StringBuffer(input.length());
    			do {
    				// On récupère le caractère trouvé :
    				int c = matcher.group().charAt(0);
    				// Et on le remplace par \u0000 :
    				matcher.appendReplacement(sb, Matcher.quoteReplacement(encoded(c)));
    			} while (matcher.find());
    			matcher.appendTail(sb);
    			return sb.toString();
    		}
    		// S'il n'y a aucun caractère on peu renvoyer a chaine tel quel !
    		return input;
    	}
    Si les données à écrire sont importantes, il est peut être préférable de mettre ce traitement dans un FilterWriter...


    a++

  4. #4
    SGJ
    SGJ est déconnecté
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    59
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 59
    Par défaut
    Merci pour vos réponses, j'ai essayé ta méthode adiGuba et elle fonctionne très bien.

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

Discussions similaires

  1. ecrire dans un fichier une immense quantité de données
    Par Platon d'athene dans le forum C
    Réponses: 8
    Dernier message: 09/03/2012, 15h00
  2. Ecrire dans un fichier à une ligne donnée
    Par Matt014 dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2011, 21h11
  3. Ecrire dans un fichier une image et un texte (un tableau)
    Par GatH7614 dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 04/11/2010, 10h32
  4. Ecrire dans un fichier une liste de liste
    Par Victoria007 dans le forum Général Python
    Réponses: 4
    Dernier message: 12/03/2008, 09h55
  5. Réponses: 3
    Dernier message: 10/10/2007, 09h15

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