C ++: caratteri estesi in uscita in modo errato?
-
01-10-2019 - |
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!
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.