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 :

Changer l'encodage d'un caractère


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut Changer l'encodage d'un caractère
    Bonjour,

    je cherche à comprendre comment transformer un caractère encodé autre que UTF-8 dans son équivalent UTF-8

    Mon exemple:

    Je souhaite transformer cette chaîne
    Info changement dadresse ==> Info - changement d'adresse

    Le tiret et l'apostrophe sont encodés en WINDOWS-1252 (à priori) et si je les stocke ainsi, il ne seront pas reconnus pour une utilisation future puisque je gère uniquement de l'UTF-8

    J'ai utilisé l'API juniversalchardet pour reconnaître l'encodage des caractères (ce n'est pas du 100% je suis d'accord, mais c'est toujours ça).

    J'ai ensuite tenté cette manip consistant à manipulet des byte pour transformer en UTF-8:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //c = un caractère String
    //encoding = encodage trouvé par juniversalchardet
    String newString = new String(decodeUtf8(c.getBytes(),encoding), "UTF-8");
    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
    private static byte[] decodeUtf8(byte[] bytes, String sourceCharset){
        Charset srcCharset = Charset.forName(sourceCharset);
        Charset utf8charset = Charset.forName("UTF-8");
     
        ByteBuffer inputBuffer = ByteBuffer.wrap(bytes);
     
        // decoder selon l'encodage en parametre
        CharBuffer data = srcCharset.decode(inputBuffer);
     
        // encoder en utf-8
        ByteBuffer outputBuffer = utf8charset.encode(data);
        byte[] outputData = outputBuffer.array();
     
        return outputData;
    }
    Or voici ce que j'obtiens pour le tiret et l'apostrophe:
    –
    Â’

    Ce ne sont pas les caractères - et ' souhaités.

    Avez vous une idée de comment effectuer cette manip svp?

    Merci

  2. #2
    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,



    Ta méthode decodeUtf8() n'a pas trop de sens.
    Et vu comment tu l'utilises tu risques même des problèmes si l'encodage par défaut du système. ne correspond pas à celui que tu utilises

    Si tu veux encoder une String en utf8 il suffit de faire ceci : s.getBytes("utf8") ...



    Mais cela ne répond pas à ton problème : tu n'as pas de problème d'encodage !
    Les caractères – et ’ correspondent tout simplement à des caractères distinct de - et '


    Si tu veux remplacer ces caractères il faut faire un replace...


    a++

  3. #3
    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 : 46
    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
    Citation Envoyé par oni13 Voir le message
    Bonjour,

    je cherche à comprendre comment transformer un caractère encodé autre que UTF-8 dans son équivalent UTF-8
    L'encodage concerne les fichier, pas les caractères. C'est la manière dont un caractère, par exemple "tiret large" est transformé en un flux de bits pour le stockage.


    Mon exemple:
    Citation Envoyé par oni13 Voir le message
    Je souhaite transformer cette chaîne
    Info changement dadresse ==> Info - changement d'adresse
    Comme dis par adiguba, c'est la méthode String.replace qui sert à remplacer des caractères. Ca n'a rien à voir avec l'encodage.
    Citation Envoyé par oni13 Voir le message
    Le tiret et l'apostrophe sont encodés en WINDOWS-1252 (à priori) et si je les stocke ainsi, il ne seront pas reconnus pour une utilisation future puisque je gère uniquement de l'UTF-8
    L'UTF-8 gère tout le champ unicode. Donc il n'y a aucun problème à y mettre un tiret large et une apostrophe inclinée. C'est quoi ton soucis in fine? Tu as une exception à la lecture du fichier? Tu as un autre caractère à la place? Ta console est incapable d'afficher ces caractères? ....

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut
    Salut,

    Ces caractères ne sont pas reconnus par mon appli web, et sont remplacés par une chaîne vide.
    La console eclipse ne sait également pas afficher ces caractères mais ce n'est pas gênant.

    Contexte:
    Je lis un fichier CSV que je manipule pour y stocker des données en BDD (je ne stocke pas le fichier mais certaines de ses lignes en tant que varchar)
    ==> La chaîne est correctement stockée en BDD avec le tiret long et apostrophe incliné.
    A la restitution des données, j'observe des "carrés" dans le retour de mon WS indiquant que les caractères ne sont pas reconnus, et le navigateur ne les affiche pas (remplace par chaîne vide)

    Il arrive que dans ce fichier se trouvent certains caractères illisibles par mon appli, je ne sais pas pourquoi ni comment les reconnaître, je ne peux pas me permettre de mettre en place un .replace() sur une liste non exhaustive de caractères, je cherche un moyen de transformer tout caractère "illisible" en son équivalent "standard"

    Ca ne semble pas possible?

  5. #5
    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
    Citation Envoyé par oni13 Voir le message
    ==> La chaîne est correctement stockée en BDD avec le tiret long et apostrophe incliné.
    A la restitution des données, j'observe des "carrés" dans le retour de mon WS indiquant que les caractères ne sont pas reconnus, et le navigateur ne les affiche pas (remplace par chaîne vide)
    Comment s'effectue la "restitution des données" ?


    a++

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 125
    Par défaut
    Pour faire simple, il s'agit de lire une donnée en BDD et de restituer le résultat sous forme de String.
    Pas de traitement particulier sur la chaîne si ce n'est une "JSONification"

    Mon serveur expose un WS retournant du application/json; charset=utf-8 géré avec les WS Spring

    En debugg sur mon serveur (eclipse), j'observe déjà que les caractères sont remplacés par une chaine vide directement après la lecture en base, mais les caractères sont bien présents, je le sais si je lis byte/byte.
    Une fois transmis au client, il y a des "carrés" à la place

    Edit: J'ai pu noter sur le caractère "tiret long" était un couple de byte négatifs (je dis au hasard disons -60 et -102) pour un seul caractère, alors que tous les autres sont des byte positifs seuls(au hasard encore A = 32). C'est pour ça que je pensais à un problème d'encodage ou autre... je pense que c'est ça qui bloque quelque part

  7. #7
    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
    Si tu obtiens des "carrés" c'est que tu as bien un problème d'encodage quelque part, donc il faut revoir toutes tes créations/lectures de chaine de caractères.

    Cela apparait sur ces caractères car ce sont des caractères spéciaux dont l'encodage varie selon le charset (contrairement aux caractères ASCII qui sont quasiment toujours encodé de la même manière).



    J'espère que tu n'utilises pas ta méthode decodeUtf8() car c'est le genre de truc qui peut poser ce genre de problème.



    a++

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 18/08/2006, 08h09
  2. changer l'encodage d'une base
    Par Invité dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 01/02/2006, 14h18
  3. [unicode/ascii] Comment changer l'encodage par défaut????
    Par Mr Hyde dans le forum Général Python
    Réponses: 2
    Dernier message: 07/10/2005, 09h24
  4. Changer l'encodage d'une base ou d'une table
    Par Mr Hyde dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 05/10/2005, 22h55

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