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

Java Discussion :

Runtime.Exec et UTF8


Sujet :

Java

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2010
    Messages : 58
    Par défaut Runtime.Exec et UTF8
    Bonjour,

    Je souhaiterais exécuter cette commande dans mon programme java, mais ca ne fonctionne pas:

    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRuntime().exec("explorer  "+"D:\\한국어");

    Je reçois une erreur comme cela:

    The path "D:\\???" does not exist.

    Quelqu'un sait comment faire?

    Merci par avance

  2. #2
    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 : 45
    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
    Vous devez doublez les \ quand vous créez une string java.

    Je vous recommande aussi de séparer l'application de ses argmuents, c'est plus clair à lire:

    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Runtime.getRuntime().exec(new String[] {
                  "explorer ",
                  "D:\\\\한국어"}
                  );

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2010
    Messages : 58
    Par défaut
    Merci pour votre réponse, cependant le soucis ne semble pas venir des \\\\, en effet, en faisant

    Runtime.getRuntime().exec(new String[] {
    "explorer ",
    "D:\\toto"}
    );

    La commande fonctionne bien.
    Il semblerait que ce soit lié aux caractères UTF8

  4. #4
    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 : 45
    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
    Êtes vus sûr que votre compilateur lit bien correctement votre fichier source (dans l'encodage qui a été utilisé pour le sauver) ?

    Pourriez vous afficher le résultat de
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) throws FileNotFoundException, FontFormatException, IOException {
    		String s = "한국어";
    		for (char c: s.toCharArray())
    			System.out.printf("0x%4X ",(long)c);
    		System.out.println();
    	}

    Vous devriez obtenir ceci si le compilateur fonctionne correctement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    0xD55C 0xAD6D 0xC5B4
    Essayez aussi ceci pour votre code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Runtime.getRuntime().exec(new String[] {
                  "explorer ",
                  "D:\\\ud55c\uad6d\uC5B4"}
                  );

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Janvier 2010
    Messages : 58
    Par défaut
    Concernant la première partie ca fonctionne bien, j'ai bien eu comme output:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1
    20xD55C 0xAD6D 0xC5B4
    Par contre en faisant ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Runtime.getRuntime().exec(new String[] {
                  "explorer ",
                  "D:\\\ud55c\uad6d\uC5B4"}
                  );
    J'ai toujours l'erreur suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    the path D:\\??? does not exists or is not a directory.

    De plus quand je fais
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    Runtime.getRuntime().exec("D:\\한국어");
    J'ai une erreur du genre
    Code x : Sélectionner tout - Visualiser dans une fenêtre à part
    Cannot execute D:\\한국어
    Le nom du dossier est bien pris en compte.

  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 : 45
    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
    il est possible que le nom du fichier sur le filesystem soit erroné.
    Pourriez vous faire un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new File("D:\\").list()
    et afficher le nom de tous les fichiers présents?

  7. #7
    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 : 45
    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
    je me souviens d'un bug report dans la jvm (lié à la classe File) qui mentionnait que java utilisait l'api windows prenant des char[] plutot que celle prenant des handle de fichier, et que ca posait problème avec certains caractères, c'est peut être lié.


    PS: faudrait voir accessoirement, si du code équivalent en C en est capable, je connais pas les limites de windows.

  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 : 45
    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
    vous pourriez essayer d'ajouter

    -Dfile.encoding=UTF-8

    à votre appel à java?

  9. #9
    Membre expérimenté
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Par défaut
    Bonjour à tous.
    vous êtes sûr qu'on peut faire de l'UTF-8 en ligne de commande?
    parce que dans un bat par exemple, je suis presque sûr qu'il faut respecter l'encoding DOS: le CP437 ou CP850 (même pas le CP1252 de windows)
    http://www.kostis.net/charsets/trans130/cpdos.htm

    Un moyen de contournement faire un "Dir /x" pour avoir le nom du répertoire en nom 8.3 qui lui est ASCII et passe de partout.

  10. #10
    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 : 45
    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
    on ne parle pas de ligne de commande ici, mais de demander à l'os d'exécuté un programme identifié par son nom. LE fait que la ligne de commande ne supporte pas le nom, ne veux pas dire qu'on ne peux pas cliquer dessus pour l'exécuter

  11. #11
    Membre expérimenté
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Par défaut
    D'accord Tchize, mais j'ai un doute car d'après la doc, on lance une commande, on passe donc par le système comme si c'était une ligne de commande:
    http://download.oracle.com/javase/6/...va.lang.String[],%20java.lang.String[],%20java.io.File)

    Mais en fait peu importe, ce qui est en UTF-8 est un argument (le dossier à faire ouvrir par l'explorer), et pas le programme lui-même; c'est donc peut-etre simplement le système qui limite l'encoding des arguments, et pas Java: est-ce que explorer.exe gère bien les arguments en UTF-8?

    Sous windows on a toujours une double table d'allocation nom long-nom court(=8.3), Windows peut toujours s'en sortir avec le nom court.
    => d'ou mon idée de contournement, qui n'est pas très propre, mais quand on fait du exec, on a déjà renoncé à la portabilité.

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par deltree Voir le message
    Mais en fait peu importe, ce qui est en UTF-8 est un argument (le dossier à faire ouvrir par l'explorer), et pas le programme lui-même; c'est donc peut-etre simplement le système qui limite l'encoding des arguments, et pas Java: est-ce que explorer.exe gère bien les arguments en UTF-8?
    Alors attention, il s'agit pas vraiment ici d'UTF-8 ou d'un charset quelconque. La commande est passée sous forme de Strings, on n'a donc pas la main sur un encodage. Après il faudra bien sûr passer par des octets pour parler aux fonctions systèmes de Windows, mais on n'a pas spécialement besoin d'UTF-8, Windows gère plutôt les noms de fichiers en UTF-16. Tous les tests que j'ai pu faire avec l'explorer tendent à indiquer qu'il peut ouvrir n'importe quel fichier dont le nom nécessite un charset unicode.

    Il semble, toutefois, que java ne soit pas capable de passer des paramètres de commande utilisant tout unicode. Uniquement des paramètres qui utilisent codepage 1252. Les autres caractères sont transformés en points d'interrogation '?', cas typique de conversion de charset unicode vers codepage 1252, avec caractères qui n'existe pas dans codepage 1252.
    Pourquoi codepage 1252 et pas autre chose, apparemment c'est dû aux réglages Windows. Changer le -Dfile.encoding Java n'a aucun effet. Mais changer la "langue par défaut des programmes non-Unicode" de Windows, si. Si je mets sur Japonais, je peux d'un seul coup passer des paramètres japonais en Java (et ce sont les accents qui deviennent des '?'.)

    Ça m'a tout l'air insoluble.

    Citation Envoyé par deltree Voir le message
    Sous windows on a toujours une double table d'allocation nom long-nom court(=8.3), Windows peut toujours s'en sortir avec le nom court.
    => d'ou mon idée de contournement, qui n'est pas très propre, mais quand on fait du exec, on a déjà renoncé à la portabilité.
    Bonne idée quand c'est possible, mais cela suppose qu'on peut facilement obtenir le nom MS-DOS du fichier visé. C'est une grosse contrainte.
    (Personnellement je suis très opposé aux noms de fichier non-ASCII, du fait que rien en informatique ne prévoie correctement ce cas et que ça pose toujours des problèmes. Mais c'est un peu compliqué de dire ça à nos amis coréens, chinois, japonais, russes, arabes...)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [RUNTIME][EXEC]
    Par adrien1977 dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 30/09/2009, 16h28
  2. [Runtime][exec]Récupérer les stdout ET stderr
    Par yveslamand dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 20/05/2005, 13h37
  3. [Runtime]exec() avec une commande paramétrée
    Par nice dans le forum Général Java
    Réponses: 9
    Dernier message: 12/05/2005, 13h15
  4. [Servlet][Windows][System call]Runtime.exec
    Par lucho31 dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 18/01/2005, 11h55
  5. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54

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