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 :

Java byte encodage


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut Java byte encodage
    Bonjour,

    Je fait un client/serveur basé sur des sockets. Point principal, je veux envoyer depuis le client une liste avec des noms de fichiers, que le serveur récupère et utilise (ouverture fichiers, listing, etc...)

    Comme les noms de fichiers ont parfois un encodage exotique, je veux les envoyer en tableau de byte (je suis sous linux du coté serveur, donc les méthodes primitives me permettront d'ouvrir les fichiers sans problème même si l'encodage n'est pas réellement défini).

    Mon problème se situe au niveau client. Comment puis-je faire pour récupérer (à partir d'un fichier de config ou directment du filesystem) les noms des fichiers directement en byte ? Car en général dans l'API Java (que je ne connais pas très bien je l'avoue), je récupère des String. Hors si je me trompe pas, les String en Java sont toujours encodées (UTF16 par défaut)...

    Merci

  2. #2
    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
    À ma connaissance, ce n'est pas possible. Il faudrait faire une bibliothèque JNI pour ça.

    Note que pour transformer une String en tableau de bytes, il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    byte[] bytes = "Bonjour à tous !".getBytes("utf-16LE");
    par exemple.

    Mais cela ne te dira pas quels étaient les octets originels pour représenter le nom de fichier : ces octets ont été transformés en String d'une manière inconnue et ne sont plus accessibles. Et après tu retransformes cette String en octets en utilisant un charset quelconque.

    Cela dit, si je ne me trompe pas, Windows utilise canoniquement UTF-16LE pour les noms de fichiers.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    Oui, c'est bien là mon problème, je ne peux pas récupérer le nom de fichier en conservant le charset inconnu, le passage par une String casse tout Il faudrait que le constructeur String prenne en compte un charset null, que l'API Java donne des accès utilisant directement un tableau de bytes...

    Mais comme tu le précise, une solution, JNI....

  4. #4
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Il n'y a pas d'encodage pour les char !
    C'est une représentation interne qu'on appelle codepoint (Voir UNICODE sur Wikipedia ou le site officiel)
    UTF-8, UTF-16 c'est un moyen de stockage de ces codepoint.

    Unicode c'est une représentation (binaire) d'un caractère et non un encodage.
    Un encodage permet de stocker la représentation d'un caractère.

    Si tu veux transférer des caractères soit tu transfères en encodant (ca permet de gagner de la place) soit tu transfères leur réprésentation binaire (en Java il suffit de caster un char en int et inversement).
    Cependant attention car la méthode write(int) de l'OutputStream n'écrit que le plus petit octet.
    Writes the specified byte to this output stream. The general contract for write is that one byte is written to the output stream. The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.
    source
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    Oui je ne dis pas le contraire, c'est justement pour cela que j'utilise les byte pour transférer mes noms de fichiers

    C'est pour le point d'entrée le plus gênant (pour moi, car je suis pas très avancé en java).

    C'est bon pour les récupérer à partir d'un fichier (fichier contenant les noms de fichiers écrits en encodage exotique), en utilisant un FileInputStream pas de soucis...

    Mais c'est un workaround, maintenant je vais essayer de récupérer les noms de fichier directement à partir du filesystem.

  6. #6
    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
    Note que, même si je comprends ce que tu dis, au fond Nemek n'a pas tort en disant que tu n'as pas la bonne approche.

    Les "noms de fichiers exotiques", en principe sous Windows, ne sont pas constitués de bytes, mais plutôt de code points unicode de U+0 à U+FFFF, avec éventuel emploi des surrogates. Par conséquent, un nom comme a.txt ne devrait pas être constitué de 5 octets, mais 10 octets.
    Or toi, tu t'attends à voir 5 "trucs", non ? 5 unités logiques. Je ne sais pas exactement ce que c'est censé être, peut-être des w_char, mais il est censé y en avoir 5 pour a.txt.

    Ce qui te pose vraiment problème, ce n'est pas que tu n'as pas accès aux octets.
    Ce qui te pose problème, c'est que tes noms de fichiers contiennent des caractères qui ne sont pas gérés dans le charset par défaut de ta plate-forme, or Java, sous Windows, ne lit et n'écrit les noms de fichiers qu'en passant par ce charset par défaut, au lieu de passer simplement par les APIs de fichier Unicode.
    C'est là qu'il est le problème. Ce qu'il faudrait c'est une bibliothèque JNI qui lise les noms de fichiers avec une API plus moderne. Il me semble que c'est prévu dans le prochain JDK.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre expérimenté
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Par défaut
    Bonjour,
    Pour encoder sur un flux, il est plus pratique d'utiliser InputStreamReader et OutputStreamWriter qui travaillent sur des string, en précisant bien l'encoding dans le constructeur.
    l'UTF-8 serait amha le plus pratique, puisqu'il contient tous les caractères spéciaux et est un sur-ensemble de l'ASCII. cela permet par exemple de brancher les programmes java sur un telnet.

    edit pour la réponse arrivée entre-temps: Je ne comprend pas bien cette hiostoire de byte: les noms de fichier obtenu à partir de la classe "File" seront des String, on n'a besoin de manipuler la représentation interne de java, puisque par encodage-decodage, on le récupère sous la même forme de l'autre côté de la socket.

Discussions similaires

  1. Java EE, Encodage des caractères dans un formulaire
    Par sanzo1988 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 09/06/2012, 12h21
  2. Différence entre Java byte-code et MSIL
    Par medamin27 dans le forum Général Java
    Réponses: 0
    Dernier message: 10/06/2011, 01h14
  3. java byte[][] vs. C void**
    Par lvr dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 15/09/2008, 13h47
  4. problème java-mysql encodage des caracteres
    Par mrdindo dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 14/06/2008, 14h13
  5. [ENCODAGE][JAVA]Afficher correctement des accents
    Par kornelius dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/02/2004, 16h37

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