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

MFC Discussion :

conversion chaineISO8859-1,... en UTF-8


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut conversion chaineISO8859-1,... en UTF-8
    La fonction suivante :
    me permet de convertir une chaine de caractères classique en UTF-8 en lui passant en paramètre .
    Seulement, je peux me retrouver dans le cas de différents code-page (le ISO8859-1 la plupart du temps) mais je peux aussi me retrouver avec des jeux de caractères espagnol, polonais, grec, ...
    Ce que je voudrais, c'est qu'en fonction de mon code-page, je puisse transformer ma chaine en UTF-8 correcte.
    Pour l'instant, je ne sais pas détecter si je suis en ISO8859-1 ou autres. Si je me retrouve par exemple avec un caractère grec dont le code ASCII correspond au caractère en ISO8859-1, ma chaine en UTF-8 aura donc été encodée avec le code UTF-8 du caractère et non pas du caractère grec qui aurait dû être encodé à la base.
    Merci si vous avez une idée

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Pardon je me suis mal exprimé, je sais détecter dans quel code-page je suis mais je ne sais pas comment traduire cela en langage C++ (conversion code-page en UTF-8 ).

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Je viens d evoir qu'il existyait la fonction :
    Peut-être utiliser cella-là ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Je ne connais pas cette fonction, mais avec WideCharToMultiByte(), tu peux convertir de l'unicode Wide (UTF-16) aussi bien en ANSI qu'en UTF-8 (si tu as un Windows >= 98)

    (Mince, presque grillé)
    Lors de la conversion ISOxxx -> UTF-16, utilise SetLocale() d'abord, je crois que ça devrait t'aider...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Merci mais pour la conversion ISOxxxx -> UTF-8, je ne vois pas bien ce que vient faire la focntion SetLocale() qui d'après l'aide s'applique à une ComboBox.
    Quant à moi, je ne récupère pas le code-page régional mais le code-page stocké dans un fichier texte.
    Une autre piste peut-être svp ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Désolé pour la combobox, c'était setlocale() sans majuscules dont je voulais parler.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    merci pour la fonction, je vais regarder ce que je peux faire avec.

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Eventuelle autre piste.
    En C++ portable, j'ai croisé (et pas essayé) des facets de conversions dans une des biblios de boost (laquelle, j'ai oublié ; c'était utilisé en interne), et dans Adam&Eve (d'Adobe).

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Je viens de voir setlocale, ça marche jusqu'à NT mais ça m'a l'air un peu dépassé pour 2003

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Petite question simple, j'ai dans wchar_t un caractère correspondant au code 0x394.
    Quelles commande exécuter pour qu'il s'affiche en grec, français, ... ?

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    J'ai essayé avec le setlocale mais sans succès

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Je viens de faire le test du code suivant (en essayant de transformer le code 0xE5 cyrillique en UNICODE) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       char util[2];
       util[0] = 0xE5;
       util[1] = '\0';
       char*  soaputf8 = 0;
       setlocale (LC_ALL, "rus");
       _bstr_t soapbstr = util;
       int sizeutf8 = soapbstr.length()*4;
       soaputf8 = new char[sizeutf8];
       sizeutf8 = WideCharToMultiByte(CP_UTF8,0,soapbstr,soapbstr.length(),soaputf8,sizeutf8,0,0);
    Puis le code suivant (en essayant de transformer le code 0xE5 grec en UNICODE) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       char util[2];
       util[0] = 0xE5;
       util[1] = '\0';
       char*  soaputf8 = 0;
       setlocale (LC_ALL, "ell");
       _bstr_t soapbstr = util;
       int sizeutf8 = soapbstr.length()*4;
       soaputf8 = new char[sizeutf8];
       sizeutf8 = WideCharToMultiByte(CP_UTF8,0,soapbstr,soapbstr.length(),soaputf8,sizeutf8,0,0);
    Dans les 2 cas, j'ai fait un quickwatch sur ma variable soaput8 résultant et je me suis retrouvé avec un sizeutf8=2 et :
    soaput8[0] = 0xc3
    soaput8[1] = 0xa5
    J'avais l'impression que mon résultat était donc la transformation du caractère 0xE5 du codepage 1252 mais en regardant sur unicode.org, j'ai vu que le caractère 0xE5 correspondait en unicode à 00E5 (donc un caractère sur un seul octet).
    Outre le fait que setlocale est deprecated (enfin je pense), sauriez-vous m'expliquer le résultat de ma variable de retour qui ne correpond ni à du codepage 1252 standard, ni a du codepage 1251 cyrillique, ni à du 1253 grec.
    Je vous remercie car je commence à me noyer

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Avec le setlocale, j'ai essayé avec d'autres langues, toujours le même résultat !
    Please, help !

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Je viens de voir qu'il existait une classe UTF8Encoding mais pas d'exemple avec différents code page...

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    J'ai regardé aussi avec WideCharToMultiByte, pas moyen de lui passer le codepage que l'on veut...
    Des pistes ?
    un SDK qui fait ça ?

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    J'ai téléchargé le projet situé dans :
    http://www.codeproject.com/string/UTF8.asp
    Il y a un code sources permettant de transformer n'importe quel caractère en UTF-8 dont voici le code :
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
     
    CString EncodeToUTF8(LPCTSTR szSource)
    {
    	WORD ch;
     
    	BYTE bt1, bt2, bt3, bt4, bt5, bt6;
     
    	int n, nMax = _tcslen(szSource);
     
    	CString sFinal, sTemp;
     
    	for (n = 0; n < nMax; ++n)
    	{
    		ch = (WORD)szSource[n];
     
    		if (ch == _T('='))
    		{
    			sTemp.Format(_T("=%02X"), ch);
     
    			sFinal += sTemp;
    		}
    		else if (ch < 128)
    		{
    			sFinal += szSource[n];
    		}
    		else if (ch <= 2047)
    		{
    			 bt1 = (BYTE)(192 + (ch / 64));
    			 bt2 = (BYTE)(128 + (ch % 64));
     
    			sTemp.Format(_T("=%02X=%02X"), bt1, bt2);
     
    			sFinal += sTemp;
    		}
    		else if (ch <= 65535)
    		{
    			 bt1 = (BYTE)(224 + (ch / 4096));
    			 bt2 = (BYTE)(128 + ((ch / 64) % 64));
    			 bt3 = (BYTE)(128 + (ch % 64));
     
    			sTemp.Format(_T("=%02X=%02X=%02X"), bt1, bt2, bt3);
     
    			sFinal += sTemp;
    		}
    		else if (ch <= 2097151)
    		{
    			 bt1 = (BYTE)(240 + (ch / 262144));
    			 bt2 = (BYTE)(128 + ((ch / 4096) % 64));
    			 bt3 = (BYTE)(128 + ((ch / 64) % 64));
    			 bt4 = (BYTE)(128 + (ch % 64));
     
    			sTemp.Format(_T("=%02X=%02X=%02X=%02X"), bt1, bt2, bt3, bt4);
    			sFinal += sTemp;
    		}
    		else if (ch <=67108863)
    		{
    			bt1 = (BYTE)(248 + (ch / 16777216));
    			bt2 = (BYTE)(128 + ((ch / 262144) % 64));
    			bt3 = (BYTE)(128 + ((ch / 4096) % 64));
    			bt4 = (BYTE)(128 + ((ch / 64) % 64));
    			bt5 = (BYTE)(128 + (ch % 64));
     
    			sTemp.Format(_T("=%02X=%02X=%02X=%02X=%02X"), bt1, bt2, bt3, bt4, bt5);
    			sFinal += sTemp;
    		}
    		else if (ch <=2147483647)
    		{
    			 bt1 = (BYTE)(252 + (ch / 1073741824));
    			 bt2 = (BYTE)(128 + ((ch / 16777216) % 64));
    			 bt3 = (BYTE)(128 + ((ch / 262144) % 64));
    			 bt4 = (BYTE)(128 + ((ch / 4096) % 64));
    			 bt5 = (BYTE)(128 + ((ch / 64) % 64));
    			 bt6 = (BYTE)(128 + (ch % 64));
     
    			sTemp.Format(_T("=%02X=%02X=%02X=%02X=%02X=%02X"), bt1, bt2, bt3, bt4, bt5, bt6);
    			sFinal += sTemp;
    		}
     
    	}
     
    	return sFinal;
    }
    Mais quand j'y regarde de plus près, la chaine résultante encodée en UTF-8 ne correspond pas du tout aux codes UTF-8 de unicode.org.
    Je vais abandonner cette piste, est-ce que vous avez une idée sur le codage de ctte fonction toute simple :

    Encode (in chaineaencoder, in codepage, out chaineencodeeenUTF8)

    Merci[/code]

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    C'est bon, j'avais fait un amalgamme entre l'unicode et l'UTF-8 qui permet justement de ne pas tout encoder sur plusieurs octets pour aléger les données.
    D'ailleurs, voilà l'encodage UTF-8 à partir de l'unicode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    0000000-0000007f 0xxxxxxx
    00000080-000007ff 110xxxxx 10xxxxxx
    00000800-0000ffff 1110xxxx 10xxxxxx 10xxxxxx
    00080000-001fffff 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    00200000-03ffffff 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxx
    04000000-7fffffff 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxx 10xxxxx
    Alors ma question devient comment transformer un caractère (arabe, grec, cyrillique,...) présenté sur un octet en Unicode ? Donc, une fonction qui devient :

    Encode (in chaineaencoder, in codepage, out chaineencodeeenunicode)

  18. #18
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    En fait, oui, ce qu'il faut trouver, c'est comment, sur un Windows moderne, passer d'un couple (caractère, codepage) à un caractère unicode. Je pensais que setlocale() et MultiByteToWideChar() étaient suffisant pour cela, mais puisque d'après toi ça ne marche pas, je n'ai plus d'idées...

    Edit: J'ai trouvé!
    J'avais mal lu la doc de MultiByteToWideChar() : Les valeurs énumérées ne sont pas les seules possibles!
    Essaie de passer directement un numéro de codepage Windows à la place de CP_ACP, et normalement tu n'auras même plus besoin de setlocale().

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    OK je suis sur autre chose, mais dès que je peux, je vais tester en passant directement le codepage (je n'avais pas non plus dans le .h les #define des codepage) voir ce que ça donne.
    Je te remercie pour l'info.

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    Ca ne marche pas non plus !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. VBA : conversion fichier texte en UTF-8
    Par philou8 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/12/2009, 18h50
  2. Conversion du caractère & en UTF-8 ?
    Par astrofiles dans le forum Général Java
    Réponses: 5
    Dernier message: 05/01/2007, 16h40
  3. conversion iso-8859-1 => UTF-8 (unicode)
    Par pierru666 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 30/05/2006, 22h17
  4. Conversion du charset cyrillique vers l'UTF-8
    Par pach dans le forum Oracle
    Réponses: 2
    Dernier message: 12/01/2006, 13h47
  5. Conversion vers UTF-8
    Par magnus2005 dans le forum Langage
    Réponses: 1
    Dernier message: 26/10/2005, 10h12

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