Introducción
std::string text = "á";
"a" es el carácter de dos bytes (suponiendo una codificación UTF-8). Así
siguiente imprime la línea 2.impulso :: :: property_tree json_parser y de dos bytes caracteres anchos
std::cout << text.size() << "\n";
Pero todavía std::cout
texto se imprime correctamente.
std::cout << text << "\n";
Mi problema
Paso text
a boost::property_tree::ptree
y luego a write_json
boost::property_tree::ptree root;
root.put<std::string>("text", text);
std::stringstream ss;
boost::property_tree::json_parser::write_json(ss, root);
std::cout << ss.str() << "\n";
El resultado es
{
"text": "\u00C3\u00A1"
}
texto es igual a "¡" que es diferente que "á".
¿Es posible solucionar este problema sin cambiar a std::wstring
? ¿Es posible que cambiar la biblioteca (boost::property_tree::ptree
) pueda resolver este problema?
Gracias por su respuesta. Buen hallazgo con 'boost :: property_tree :: json_parser :: create_escapes'. Tu solución es definitivamente una mejora. Pero no creo que funcione para todo el juego de caracteres UTF-8; /. ¿Estoy en lo cierto? –
Todos los bytes que codifican caracteres Unicode sobre 0x7F son superiores a 0x7F (debajo de 0 para char firmado), por lo que esta función pasa correctamente a través de UTF-8. Algunos caracteres Unicode pueden no ser imprimibles, por supuesto, y alguna secuencia UTF-8 nunca debe aparecer. – Arpegius
El estándar JSON no hace suposiciones sobre la codificación. Según RFC 46273. Codificación El texto JSON DEBE estar codificado en Unicode. La codificación predeterminada es UTF-8. Dado que los dos primeros caracteres de un texto JSON siempre serán caracteres ASCII [RFC0020], es posible determinar si un octeto es UTF-8, UTF-16 (BE o LE) o UTF-32 (BE o LE) mirando en el patrón de nulos en los primeros cuatro octetos. 00 00 00 xx UTF-32BE 00 xx 00 xx UTF-16BE xx 00 00 00 UTF-32LE xx 00 xx 00 UTF-16LE xx xx xx xx UTF-8 –