Question

Mon code est essentiellement ceci:

wstring japan = L"日本";
wstring message = L"Welcome! Japan is ";

message += japan;

wprintf(message.c_str());

Je souhaite utiliser des chaînes larges mais je ne sais pas comment ils sont délivrés, donc je wprintf. Quand je lance quelque chose comme:

./widestr | hexdump

Les codepoints hexadécimaux créent ceci:

65 57 63 6c 6d 6f 21 65 4a 20 70 61 6e 61 69 20 20 73 3f 3f
e  W  c  l  m  o  !  e  J     p  a  n  a  i        s  ?  ?

Pourquoi sont-ils tous sauté dans l'ordre? Je veux dire si le wprintf est mal, je ne comprends toujours pas pourquoi il avait sortie dans un tel ordre spécifique pêle-mêle!

modifier: boutisme ou quelque chose? ils semblent tourner chacun deux caractères. hein.

EDIT 2: J'ai essayé d'utiliser wcout, mais il délivre en sortie les mêmes codepoints hexadécimaux exactes. Bizarre!

Était-ce utile?

La solution

Vous devez définir locale

    #include <stdio.h>
    #include <string>
    #include <locale>
    #include <iostream>

    using namespace std;

    int main()
    {

            std::locale::global(std::locale(""));
            wstring japan = L"日本";
            wstring message = L"Welcome! Japan is ";

            message += japan;

            wprintf(message.c_str());
            wcout << message << endl;
    }

fonctionne comme prévu (à savoir convertir large chaîne en UTF-8 et l'imprimer étroite).

Lorsque vous définissez locale globale sur « » - vous paramètres régionaux du système set (et si elle est UTF-8, il serait être imprimé comme UTF-8 - à savoir wstring sera convertie)

Modifier oublier ce que je dit à propos sync_with_stdio - ce n'est pas correct, ils sont synchronisés par défaut. Pas nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top