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 C++ Discussion :

Convertir des wchar_t en byte (unsigned char)


Sujet :

Langage C++

  1. #1
    Membre très actif
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Par défaut Convertir des wchar_t en byte (unsigned char)
    Bonjour,

    Je cherche depuis un bon moment maintenant comment convertir des tableau de wchar_t en tableau de byte (unsigned char) et inversement.

    En dotnet j'ai l'habitude de faire Encoding.UNICODE.GetBytes("ma string"); (nota : les strings en dotnet sont ces wchar_t). Et Encoding.UNICODE.GetString(mon tableau de byte);

    J'ai beau cherché je ne trouve pas comment effectuer les mêmes opérations en C++.

    Merci de votre aide .

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    La question est un peu imprécise (et il n'y a malheureusement pas de réponse simple). Déjà, il ne faut pas mélanger format de stockage et encodage. Tes wchar_t sont encodés comment ? Si tu es sous windows, la réponse est probablement UTF-16. Et les chars résultants, tu voudrais qu'ils soient encodés comment ? UTF-8 ? La locale courante de la machine ? Autre ?

    Quoi qu'il en soit, il n'y a rien en C++ standard pour faire ça. Tu peux te tourner soit vers des API spécifiques à ta machine (WideCharToMultiByte par exemple, sous windows), soit vers une bibliothèque externe (http://site.icu-project.org/ ou boost.locale, plus à la mode C++, qui est en cours d'intégration dans boost, ou encore des choses dans GLib (en particulier GLib::ustring qui a pour but de faciliter la manipulation de chaînes UTF-8)).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Il y a aussi les fonctions de <cstdlib>, héritages du C, wcstombs et co. La fonction setlocale (<clocale>) permet de spécifier l'encodage des multibyte string. Sous Windows, les wide strings sont toujours en UTF-16 et les multibyte strings par défaut en windows-1252 dans les pays européens.

  4. #4
    Membre très actif
    Avatar de teddyalbina
    Homme Profil pro
    Développeur .Net,C++
    Inscrit en
    Janvier 2008
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .Net,C++

    Informations forums :
    Inscription : Janvier 2008
    Messages : 466
    Par défaut
    Merci pour vos réponses j'ai décidé que le coeur de l'application se contenterait de reçevoir des tableaux de byte.

    Concernant ma question, je voudrais que wchar_t soit en UTF-8 quelque soit l'OS (je suis sous windows pour le dev). Une lib plus haut niveau se chargera des problématiques de conversions.

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Une wide string ne sera jamais encodée en UTF-8, quel que soit l'OS. Lol. Il sera toujours en forme d'ISO/IEC 10646, typiquement de l'UTF-16 ou de l'UCS-4. Mais de toute façon, cela n'est pas très important. Ce qui peuvent changer d'encodage, ce sont les multibyte string (tableaux de char en C). Des exemples de multibyte string sont :

    - iso-8859-1 : 1 octet par caractère, très utilisée dans les pages web
    - windows-1252 : 1 octet par caractère, très proche de iso-8859-1 (il en est en fait une extension), utilisé dans l'environnement graphique de Windows en Europe
    - utf-8 : nombre variable d'octet par caractère (en particulier 1 octet par caractère pour les caractères ASCII), permet d'utiliser tous les caractères unicode, utilisé dans l'environnement linux.

    Les fonctions de conversion c'est déjà dans mon message précédent . Sous Windows cependant, setlocale ne supporte pas UTF-8. Si tu dois donc compiler pour plusieurs plateformes, utilise WideCharToMultiByte (beaucoup plus simple d'ailleurs) sous Windows et les fonctions standard pour les autres plateformes.

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

Discussions similaires

  1. Convertir des "int" en "char"s
    Par gabier dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 06/04/2008, 00h39
  2. Convertir BYTE[] vers char *
    Par LordBob dans le forum C++
    Réponses: 4
    Dernier message: 13/10/2007, 10h04
  3. Convertir un array<Byte>^ en unsigned char*
    Par xxiemeciel dans le forum C++/CLI
    Réponses: 5
    Dernier message: 12/06/2007, 20h23
  4. Convertir des bytes en binaire ...
    Par Battosaiii dans le forum C
    Réponses: 2
    Dernier message: 18/03/2006, 15h47
  5. [C#] Convertir des bytes en string
    Par sorcer1 dans le forum Windows Forms
    Réponses: 8
    Dernier message: 03/02/2005, 15h52

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