libxml2
似乎將所有的字符串存儲在UTF-8中,如xmlChar *
。libxml2 xmlChar * to std :: wstring
/**
* xmlChar:
*
* This is a basic byte in an UTF-8 encoded string.
* It's unsigned allowing to pinpoint case where char * are assigned
* to xmlChar * (possibly making serialization back impossible).
*/
typedef unsigned char xmlChar;
由於libxml2
是一個C庫,沒有提供程序來得到一個std::wstring
出xmlChar *
的。我想知道的謹慎方式是否xmlChar *
轉換爲在C++ std::wstring
11是使用mbstowcs C函數,通過這樣的事情(工作正在進行中):
std::wstring xmlCharToWideString(const xmlChar *xmlString) {
if(!xmlString){abort();} //provided string was null
int charLength = xmlStrlen(xmlString); //excludes null terminator
wchar_t *wideBuffer = new wchar_t[charLength];
size_t wcharLength = mbstowcs(wideBuffer, (const char *)xmlString, charLength);
if(wcharLength == (size_t)(-1)){abort();} //mbstowcs failed
std::wstring wideString(wideBuffer, wcharLength);
delete[] wideBuffer;
return wideString;
}
編輯:只是一個供參考,我很清楚xmlStrlen
返回什麼;這是用於存儲字符串的xmlChar
的數量;我知道這不是個字符的數量而是unsigned char
的數量。如果我已經將它命名爲byteLength
,那就不那麼令人困惑了,但我認爲它會更清晰,因爲我既有charLength
也有wcharLength
。至於代碼的正確性,wideBuffer將會是大於或等於到保存緩衝區所需的大小,總是(我相信)。由於需要比wide_t
更多空間的字符將被截斷(我認爲)。
如果您想談論最謹慎的行爲方式,請避免使用'wchar_t'和'wstring'。使用Unicode時,它們比弊端更好。 –