Domanda

Il mio codice è fondamentalmente questo:

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

message += japan;

wprintf(message.c_str());

sto che desiderano utilizzare ampi archi, ma non so come stanno emessi, così ho usato wprintf. Quando eseguo qualcosa come:

./widestr | hexdump

I Codepoints esadecimali creare questo:

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  ?  ?

Perché sono tutti saltato in ordine? Voglio dire, se il wprintf è ho sbagliato ancora non capisco perché che sarebbe uscita in tale specifico ordine confuse!

modifica: endianness o qualcosa del genere? sembrano ruotare ogni due caratteri. eh.

EDIT 2: ho provato con wcout, ma uscite esattamente lo stesso codepoints esadecimali. Strano!

È stato utile?

Soluzione

È necessario definire impostazioni locali

    #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;
    }

funziona come previsto (vale a dire convertire un'ampia stringa stretta UTF-8 e stamparlo).

Quando si definisce locale globale per "" - si imposta locale del sistema (e se è UTF-8 sarebbe essere stampato come UTF-8 - wstring cioè sarà convertita)

Modifica dimentica quello che ho detto su sync_with_stdio - questo non è corretto, sono sincronizzati per impostazione predefinita. Non necessario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top