C ++: la salida de caracteres anchos de forma incorrecta?
-
01-10-2019 - |
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!
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.