libxml2
semble stocker toutes ses chaînes en UTF-8, en tant que xmlChar *
.
/**
* xmlChar:
*
* Il s'agit d'un octet de base dans une chaîne encodée en UTF-8.
* Il est non signé, ce qui permet de repérer les cas où char * est assigné
* à xmlChar * (rendant éventuellement impossible une sérialisation inverse).
*/
typedef unsigned char xmlChar;
Comme libxml2
est une bibliothèque C, il n'y a pas de routines fournies pour obtenir un std::wstring
à partir d'un xmlChar *
. Je me demande si le moyen prudent de convertir un xmlChar *
en un std::wstring
en C++11 est d'utiliser la fonction C mbstowcs, via quelque chose comme ceci (travail en cours) :
std::wstring xmlCharToWideString(const xmlChar *xmlString) {
if(!xmlString){abort();} //la chaîne fournie était nulle
int charLength = xmlStrlen(xmlString); //exclut le terminateur null
wchar_t *wideBuffer = new wchar_t[charLength];
size_t wcharLength = mbstowcs(wideBuffer, (const char *)xmlString, charLength);
if(wcharLength == (size_t)(-1)) {abort();} //mbstowcs a échoué
std::wstring wideString(wideBuffer, wcharLength);
delete[] wideBuffer;
return wideString;
}
Éditer : Juste pour information, je suis très conscient de ce que retourne xmlStrlen
; c'est le nombre d' xmlChar
utilisés pour stocker la chaîne; je sais que ce n'est pas le nombre de caractères mais plutôt le nombre d' unsigned char
. Cela aurait été moins confus si je l'avais nommé byteLength
, mais je pensais que ce serait plus clair car j'ai à la fois charLength
et wcharLength
. En ce qui concerne la correction du code, le wideBuffer sera plus grand ou égal à la taille requise pour contenir le tampon, toujours (je crois). Les caractères nécessitant plus d'espace que wide_t
seront tronqués (je pense).