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

  1. #1
    Membre actif
    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
    Points : 248
    Points
    248
    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 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    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 actif
    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
    Points : 248
    Points
    248
    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 : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    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 actif
    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
    Points : 248
    Points
    248
    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
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 511
    Points
    511
    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.

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    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

  8. #8
    Membre actif
    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
    Points : 248
    Points
    248
    Par défaut
    hmm je commence à être perdu, mais la discussion est très intéressante
    Essayons de répondre, pour voir où mon raisonnement s'écroule

    Deltree:
    Justement, je souhaite éviter de me préoccuper de l'encodage. Mais ton idée marcherait, dans le sens ou le codage/décodage doit en théorie assurer que la sortie est identique qu'à l'entrée. Reste à direau serveur quel encodage le client a utilisé pour stocker les données, et pour certaines classes de l'API Java, je ne sais pas lequel elles ont utilisées quand elles me renvoient une String...Je trouve l'utilisation des byte plus transparente, mais ça vaut le coup d'essayer aus

    thelvin
    Je n'ai pas tout compris... Au fond, je ne m'attend à aucun nombre précis d'octets pour a.txt (reprenons l'exemple ). Justement, le fait de charger des octets, transporter des octets, et "ouvrir des octets" (entendons par là ouvrir le fichier correspondant aux octets reçus) me dispense de gérer tout problème de charset, selon moi.
    Maintenant, tu as raison quand tu dis que le problème de source est le charset de départ... Mais comme il n'est pas toujours évident de le déterminer, le plus simple me paraissait d'utiliser les octets.

    Non ?

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    335
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 335
    Points : 511
    Points
    511
    Par défaut
    Merci au passage de ne mettre "-" qu'aux réponses hors sujet, et pas à ceux qui tentent de t'aider.

  10. #10
    Membre actif
    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
    Points : 248
    Points
    248
    Par défaut
    euuh, j'ai peut-être fait une bêtise , mais je ne vois pas de quoi tu parles ?

  11. #11
    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 : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Citation Envoyé par deltree Voir le message
    Merci au passage de ne mettre "-" qu'aux réponses hors sujet, et pas à ceux qui tentent de t'aider.
    Merci de ne pas incriminer tout le monde

    Je réitère ma réponse sur le sujet, la classe File te renvoie des String qui contient des char et que les char représentent tous les caractères inimaginables.
    Si tu veux pouvoir "transférer" n'importe quelle chaîne de caractères, il faut utiliser un encodage qui couvrent tout l'unicode comme les UTF-*.
    Charges à toi ensuite de lire les données transférées avec le bon encodage.
    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

  12. #12
    Membre actif
    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
    Points : 248
    Points
    248
    Par défaut
    Donc Nemek, si je comprends bien ce que tu me dis, et que je schématises, en gros je récupère via la classe File le noms des fichiers sous forme de String contenant les char encodés en {charset-utilisé-par-défaut-en-java}. C'est ce charset que je devrais utiliser côté serveur pour manipuler les données reçues.

    Mais ai-je bien compris, la principale différence avec "mon" approche par octets est le fait que j'encode d'un coté, puis que j'utilise cet encodage de l'autre ?
    (et donc que je me coltine un encodage dont je me passerai bien puisque je finirais par utiliser une méthode qui prend des char en paramètres )

  13. #13
    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 : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Java représente les caractères en interne en utilisant l'Unicode.

    Cependant pour le transfert il faut utiliser un encodage car une représentation ce ne sont pas des octets à proprement parler.

    Si tu veux transférer des caractères, il faut que tu utilises le même encodage point.

    Quelques liens qui pourraient t'aider à comprendre la différence entre jeu de caractère et encodage :
    http://fr.wikipedia.org/wiki/Unicode
    http://fr.wikipedia.org/wiki/Codage_de_caract%C3%A8res
    http://fr.wikipedia.org/wiki/UTF-8
    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

  14. #14
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par deltree Voir le message
    Merci au passage de ne mettre "-" qu'aux réponses hors sujet, et pas à ceux qui tentent de t'aider.
    Tu essaies de l'aider et tu es hors-sujet, car le problème n'est pas situé aux endroits dont tu parles.
    Ce qui devrait être clair en me lisant, ainsi qu'en essayant soi-même.
    J'enlève les - mais ils servent pourtant à ça.

    Sauf que c'est moi qui me suis planté de sujet, donc je m'écrase.

    Citation Envoyé par Nemek
    Je réitère ma réponse sur le sujet
    Inutile, ce n'est pas de cela qu'il s'agit. Lisez-moi, svp.
    Pareil.

    Citation Envoyé par drKzs
    Je n'ai pas tout compris... Au fond, je ne m'attend à aucun nombre précis d'octets pour a.txt (reprenons l'exemple ). Justement, le fait de charger des octets, transporter des octets, et "ouvrir des octets" (entendons par là ouvrir le fichier correspondant aux octets reçus) me dispense de gérer tout problème de charset, selon moi.
    Plus ou moins... Selon les préconfigurations des programmes, Windows ne leur enverra pas les mêmes octets.
    Java est malheureusement configuré comme les programmes pré-Unicode (et ce n'est pas réglable pour nous, seulement pour ceux qui font Java.)
    Par conséquent, Windows ne lui envoie que des octets dans le charset de la plate-forme par défaut.
    La plupart des programmes sont passés à la compatibilité Unicode, et reçoivent de l'UTF-16.
    Un système Unix, en recevant des fichiers au nom en UTF-16, tirerait sévèrement la tronche.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  15. #15
    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 : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Au final le problème est-il le transfert de noms de fichiers avec des caractères exotiques ?

    Ou bien la manipulation de fichiers qui ont des noms exotiques ?
    Dans ce dernier cas, est-il possible d'avoir un exemple de nom de fichier possible sous Windows mais qui pose problème en Java ?
    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

  16. #16
    Membre actif
    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
    Points : 248
    Points
    248
    Par défaut
    Oui, c'est pas faux, je pourrais être plus clair sur la problématique.

    Sur le client, j'ai des fichiers avec des noms dont je ne connais pas l'encodage.
    Sur le serveur, j'ai exactement ces mêmes fichiers (ne me demandez pas pourquoi )

    Je veux envoyer ces noms par socket, les récupérer sur le serveur et les utiliser par exemple pour ouvrir les fichiers, ou les copier, etc etc....

    Le client A est en Java sous windows, le serveur en C++ sous linux. Le passage se fait par socket.

    Voici quel avait été mon raisonnement: vu que je peux avoir au départ différents encodages, plutot que de m'en préoccuper, je veux tout faire en byte.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       récupérer nom => transmission socket => ouverture via fopen
    Aucun problème pour la réception et les traitements, car en C++ si je ne me trompe pas la classe std::string n'utilise pas de charset particulier, et semble être un container neutre pour passer les byte. C'est là que j'ai vu que la classe String en Java semblait altérer (au sens utiliser un charset particulier) les données. D'où ma question concernant la récupération du nom des fichiers sous forme de tableau de byte, et d'où cette discussion très intéressante

  17. #17
    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 : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Points : 7 083
    Points
    7 083
    Par défaut
    Dans ce cas le client doit envoyer du texte en utilisant en encodage universel (UTF-8 par exemple).
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    OutputStream os = socket.getOutputStream();
    OuputStreamWriter osw = new OutputStreamWriter(os, "UTF-8");
    PrintWriter pw = new PrintWriter(osw);
    for (String filename : filenames) {
      pw.println(filename);
    }
    pw.println(); // mark end of transfer
    pw.flush();
    pw.close();

    Ensuite le serveur doit lire les données reçues en utilisant le même encode
    Je mets pas de code car je connais pas le C++ mais il me semble que la STL fournie des objets pour gérés l'UTF-8 genre StringUTF ...
    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

  18. #18
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par Nemek Voir le message
    Dans ce dernier cas, est-il possible d'avoir un exemple de nom de fichier possible sous Windows mais qui pose problème en Java ?
    Il n'y a pas si longtemps, 日本.txt aurait été un tel exemple, sauf si le Windows est configuré en Japonais.
    Bien sûr, à présent ça marche parfaitement sur tout ce que j'ai pu tester, histoire de me donner tort . (Il reste des malfonctions, mais seulement dans des cas bien plus compliqués qu'un simple listing de noms de fichiers à caractères visibles.)
    Je présente donc mes plus plates excuses et invite le monde entier à moinsser tout ça.

    Citation Envoyé par drKzs
    Sur le client, j'ai des fichiers avec des noms dont je ne connais pas l'encodage.
    UTF-16LE... Mais peu importe. Windows te donnera ce qu'il veut.
    Pour le coup, c'est Deltree et Nemek qui ont raison, en fait : Java efface la notion d'encodage, en s'arrangeant avec Windows pour ne travailler qu'avec des caractères. Et apparemment, il ne se trompe plus.

    Tu ne peux pas avoir "différents encodage" : deux noms de fichiers sont identiques ou équivalents ou différents. Cela n'a rien à voir avec l'encodage. Il n'y a rien dont tu aurais eu à te préoccuper à ce niveau-là (même si la situation que j'expose plus haut avait perduré.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  19. #19
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2011
    Messages : 214
    Points : 338
    Points
    338
    Par défaut
    Si l'on en croit la Javadoc de Character, lorsque le char en Java (2) a été conçu l'Unicode ne comportait des caractères que de U+0000 à U+FFFF

    Depuis l'Unicode a été étendu et cela va maintenant de U+0000 à U+10FFFF (et que donc si l'on veut travailler sur la plage étendue il faut utiliser des int à la place des char, mais ce n'est pas là que je veux en venir)

    Est-ce qu'on peut envisager des nom de fichiers (sous un OS ou un autre) qui contiendront des caractères entre U+FFFF et U+10FFFF ?

    Si oui (et je le crois, la javadoc par du '\uD840') alors je pense que ça va être compliqué (impossible ?) de lire le nom de ces fichiers en utilisant java.io (pour revenir au problème initial si je l'ai bien compris)

    Edit: non en fait mon raisonnement est faux car les String utilisent des "surrogate pairs" (toujours d'après la Javadoc) pour gérer ces cas.
    Ca m'apprendra à aller jusqu'au bout avant de poster , j'espère quand même que ça fera avancer le schmilblick...

  20. #20
    Membre actif
    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
    Points : 248
    Points
    248
    Par défaut
    hmm, désolé si je vais paraître un peu (arf) têtu ou obtu ....

    Nemek
    Je récupère les noms des fichiers en String en UTF8, je les envoies via la socket en UTF8, et je les récupère en UTF8, ok (en C++, la Glib donne la classe ustring qui permet la manipulation UTF8, pour la précision). Mais sous linux (sous windows je sais pas) , il arrive qu'il ne trouve pas le fichier car le nom a été encodé en UTF8, et que certains caractères n'ont pu être convertis.

    thelvin
    Pour le coup, c'est Deltree et Nemek qui ont raison, en fait : Java efface la notion d'encodage, en s'arrangeant avec Windows pour ne travailler qu'avec des caractères. Et apparemment, il ne se trompe plus.
    Pourtant, je lis partout que lorsque tu crées une String, Java utilise forcément un charset (que tu peux préciser d'ailleurs dans le constructeur). Est-ce que je mélange les choses ?

    Tu ne peux pas avoir "différents encodage" : deux noms de fichiers sont identiques ou équivalents ou différents. Cela n'a rien à voir avec l'encodage. Il n'y a rien dont tu aurais eu à te préoccuper à ce niveau-là (même si la situation que j'expose plus haut avait perduré.)
    D'accord, sauf que dans certains charset utilisés au passage de byte vers une classe comme String en java ou Glib::ustring en C++, les caractères non reconnus sont remplacés par un caractère par défaut (ça me le fait en tout cas en UTF-8). Et donc au final, je n'ai plus le même nom de fichier.

    Désolé si je vous fait tourner en rond

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