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

SL & STL C++ Discussion :

char, string, wchar_t, wstring ?


Sujet :

SL & STL C++

  1. #1
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut char, string, wchar_t, wstring ?
    Bonjour,
    J'aimerais travailler avec des chaînes de caractères en UTF-16 et pour ceci on m'a conseillé d'utiliser les wide string de la SL. Cependant, cela ne fonctionne pas des masses. Le code suivant :
    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
    #include <iostream>
    #include <string>
     
    using namespace std;
     
     
    int main()
    {
        string text("bonjouér");
        cout<<text<<endl;
     
        wchar_t wtext[] = { 'b' , 'o' , 'n' , 'j' , 'o' , 'u' , 'é' , 'r' , 0 }; // warning: narrowing conversion of ''\37777777751'' from 'char' to 'wchar_t' inside { } [-Wnarrowing]
        wcout<<wtext<<endl;
        return 0;
    }
    Donne :
    J'ai aussi essayé d'utiliser les char16_t et u16string, mais pas moyen de faire une sortie correcte, que ce soit avec cout ou wcout.
    Un peu d'aide svp ?

    J'utilise Code::Blocks 13.12 avec GCC 4.7.1 (supporte le C++11 mais pas le C++14) sous Windows 8.1 x64 (besoin d'autres informations ?)
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Il me semble qu'il faut faire cela, mais je ne peux pas tester

    wchar_t wtext[] = L"Bonjour私 の 身体 は ビール で 出来る の かもしらない。";

    Note le L majuscule

  3. #3
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    C'est bien ce que j'avais vu ailleurs, mais...
    error: converting to execution character set: Invalid argument
    Gak. Et j'ai pas envie d'utiliser les string de la SFML, c'est du UTF-32, c'est trop gros.
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Si cela fonctionne:

    Try to use compiler switch "-finput-charset=<source charset>" in build options. More information about switch -> google
    Il faut évidemment enregistrer ton code source en UTF-16

    wchar_t problem

  5. #5
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    J'ai essayé -finput-charset=UTF-16
    cc1plus.exe: error: failure to convert UTF-16 to UTF-8
    Process terminated with status 1 (0 minute(s), 0 second(s))
    0 error(s), 0 warning(s) (0 minute(s), 0 second(s))

    Et avec -finput-charset=iso-8859-1 ça remplace le 'é' par un 'U' (ce qui donne "bonjouUr")

    (j'ai aussi essayé de réinstaller Code::Blocks, sans effet bien sûr...)
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Si c'est cela c'est juste énorme:

    It appears that CPP is telling libiconv to convert the source file from UTF-16 to UTF-8, which works, but as soon as it hits the include file, it fails. Of course, stdio.h is stored in UTF-8 on the system so trying to convert it from UTF-16 will fail right away.
    La seule solution que je vois c'est d"échapper tous les caractères, mais cela risque de mettre la grouille dans ton code
    "Bonjour私 の 身体 は ビール で 出来る の かもしらない。" -> "\u42\u6F\u6E\u6A\u6F\u75\u72\u79C1\u3000\u306E\u3000\u8EAB\u4F53\u3000\u306F\u3000\u30D3\u30FC\u30EB\u3000\u3067\u3000\u51FA\u6765\u308B\u3000\u306E\u3000\u304B\u3082\u3057\u3089\u306A\u3044\u3002"

  7. #7
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    Bon ! Ben...Je me contenterais des caractères ASCII en attendant une mise à jour qui corrige ça alors...
    Je vais devoir créer mon propre système d'écriture/lecture alors...ça va être long mais pas si compliqué en soi...
    Merci quand même pour l'aide apportée.
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Je reviens vers toi parce que je suis en train de faire un peu de C++ avec de l'Unicode ou

    Et j'ai trouvé 2-3 trucs pour gérer de l'UTF-8/ UTF-16 à l'intérieur de son programme.
    Mais comme je l'ai dit: il faut échapper tous les caractères et surtout ne travailler qu'avec des unsigned char (UTF-8) et des unsigned short (UTF-16)
    Après que ces fichiers sources soit en UTF-8 ou en ANSI et si le projet gère l'Unicode ou pas, cela on doit s'en fichtre puisqu'on n'utilise pas tous les types par défaut comme wchar_t.


    1ière chose que j'ai trouvé:
    Le prompt/ l'invite de commande/ la ligne de commande de Windows peut afficher des caractères UTF-8:
    Il faut utiliser la commande "chcp 65001"
    Et il faut changer dans les options la police à "Lucida Console". Il faut peut-être mettre la police en gras

    Pour l'UTF-16. Il y a les code pages 1200 (little endian) et 1201 (big endian), mais ils sont bloqués pour les applications.
    Peut-être en passant par PowerShell

    Pour Linux, je pense que la majorité des prompts sont en UTF-8.

    Par contre, la police "Lucida Console" dans le prompt Windows n'affiche pas tous les caractères comme "您好所有"

    2ième chose que j'ai trouvé:
    Une petite librairie sans cpp qui semble fonctionner: à tester en profondeur UTF8-CPP


    Voici un petit code source qui manipule cette chaîne de caractères "привет всем" UTF-8 <-> UTF-16
    Par contre le cout C++ semble avoir du mal

    L'Unicode est méchamment complexe : il y a différences représentations, des code points, des code units ...
    Mais il faut passer par un outil en ligne comme celui ci et prendre les code units.

    Après on peut peut-être éviter de faire des tableaux et passer par des chaînes de caractères échappés

    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
    #include "utf8/utf8.h"
     
    #include<vector>
    #include<cstdio> // Linux
     
    using namespace std;
     
     
    int main(int argc, char* argv[])
    {
    //  привет всем
        utf8::uint8_t  utf_8[]  = {0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x82, 0x20, 0xD0, 0xB2, 0xD1, 0x81, 0xD0, 0xB5, 0xD0, 0xBC, '\0'};
        utf8::uint16_t utf_16[] = {0x43F, 0x440, 0x438, 0x432, 0x435, 0x442, 0x20, 0x432, 0x441, 0x435, 0x43C, '\0'};
     
        unsigned char size_utf_8 = 0, size_utf_16 = 0;
        {
            utf8::uint8_t*  it1 = utf_8;  while(*it1 != '\0') { ++it1; ++size_utf_8; }
            utf8::uint16_t* it2 = utf_16; while(*it2 != '\0') { ++it2; ++size_utf_16; }
        }
     
        vector<utf8::uint8_t>  utf8result;
        vector<utf8::uint16_t> utf16result;
     
        utf8::utf16to8(utf_16, (utf_16 + size_utf_16), back_inserter(utf8result));
        utf8::utf8to16(utf_8,  (utf_8  + size_utf_8),  back_inserter(utf16result));
     
        utf8result.push_back('\0');
        utf16result.push_back('\0');
     
        printf("UTF-8 : %s\nConvert UTF16 -> UTF-8 : %s\nConvert UTF8  -> UTF-16: ", utf_8, utf8result.data());
     
        for(unsigned char c = 0; c < 11; ++c) {
            printf("%x ", utf16result[c]);
        }
        printf("\n");
     
        return 0;
    }
    Édit: la balise code n'aime pas l'Unicode

  9. #9
    Membre habitué
    Avatar de Glân von Brylân
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2014
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2014
    Messages : 133
    Points : 186
    Points
    186
    Par défaut
    Merci, mais finalement il se trouve que la SFML propose des classes de conversion entre les divers Unicodes et l'ASCII, j'ai à peu près compris comment cela fonctionne, mais en tous cas ça me suffit (et puis fuck la console après tout...).
    Mais merci quand même !
    Les pointeurs intelligents, c'est mignon mais trop long à écrire.

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

Discussions similaires

  1. char*, string et wstring
    Par esteban dans le forum C++
    Réponses: 14
    Dernier message: 18/02/2011, 15h52
  2. string et wstring
    Par superspag dans le forum C++
    Réponses: 7
    Dernier message: 20/01/2006, 08h31
  3. char *, string et tableau statique ou dynamique
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 05/12/2005, 11h33
  4. Conversion char * vers wchar_t
    Par Zapan dans le forum C++
    Réponses: 4
    Dernier message: 24/02/2005, 15h56
  5. Réponses: 3
    Dernier message: 26/05/2004, 23h03

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