Estoy usando TinyXML para analizar/compilar archivos XML. Ahora, de acuerdo con the documentation, esta biblioteca admite conjuntos de caracteres multibyte a través de UTF-8. Hasta ahora todo bien, creo. Pero, la única API que proporciona la biblioteca (para obtener/configurar nombres de elementos, nombres y valores de atributos, ... todo en donde se usa una cadena) es a través de std::string
o const char*
. Esto me hace dudar de mi propia comprensión del soporte de conjunto de caracteres multibyte. ¿Cómo puede una cadena que solo admite caracteres de 8 bits contener un carácter de 16 bits (a menos que use una página de códigos, lo que negaría la afirmación 'admite Unicode')? Entiendo que en teoría podría tomar un punto de código de 16 bits y dividirlo en 2 caracteres en un std::string
, pero eso no transformaría el std::string
en una cadena 'Unicode', lo haría inválido para la mayoría de los propósitos y tal vez accidentalmente trabajo cuando se escribe en un archivo y se lee en otro programa.¿Cómo funciona el soporte UTF-8 de TinyXML?
Entonces, ¿alguien puede explicarme cómo una biblioteca puede ofrecer una 'interfaz de 8 bits' (std::string
o const char*
) y aún admite cadenas 'Unicode'?
(Probablemente confundí un poco la terminología de Unicode aquí, disculpe la confusión que pueda surgir).
Ok gracias, está cada vez más claro, pero aún así - usando std :: string para representar los datos UTF-8 de esta manera, ¿no es eso semánticamente incorrecto? Nunca podrá confiar en los contenidos de esa cadena, ¡ni siquiera habrá forma de saber cuánto tiempo durará! (en longitud del personaje). – Roel
E incluso para la versión de const char *, aún tendría que usar otra biblioteca para trabajar con la cadena de manera confiable. – Roel
Más indefinido que incorrecto. Los métodos de std :: string (concatenación, iteración, iteración, find_ *, etc.) aún funcionan. length() solo se define como == size() de todos modos. Hay una nueva condición previa de que los desplazamientos se encuentren en un límite de char. Si std :: string hizo alguna promesa sobre la codificación, sería incorrecto, pero no es así. – puetzk