Pregunta

Mi código es básicamente el siguiente:

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

message += japan;

wprintf(message.c_str());

Estoy deseando utilizar cadenas amplios, pero no sé cómo se emiten, por lo que utiliza wprintf. Cuando ejecuto algo como:

./widestr | hexdump

Los puntos de código hexadecimal crean esto:

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

¿Por qué están todos ellos saltó en orden? Me refiero a si el wprintf es equivocado todavía no entiendo por qué se había salida en un orden alterado tan específico!

editar: endianness o algo? que parecen girar cada dos caracteres. eh.

EDIT 2: He intentado utilizar wcout, pero salidas exactamente los mismos puntos de código hexadecimal. Extraño!

¿Fue útil?

Solución

Es necesario definir la configuración regional

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

funciona como se espera (es decir, convertir a toda la cadena estrecha UTF-8 e imprimirlo).

Cuando se define la configuración regional global para "" - que conjunto regional del sistema (y si es UTF-8 que lo haría ser impresos como UTF-8 - wstring es decir, será convertido)

Editar se olvide lo que dije sobre sync_with_stdio - esto no es correcto, se sincronizan de forma predeterminada. No es necesario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top