【发布时间】:2013-01-01 01:28:50
【问题描述】:
libxml2 似乎将其所有字符串都存储在 UTF-8 中,如 xmlChar *。
/**
* 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 库,因此没有提供从xmlChar * 中获取std::wstring 的例程。我想知道在 C++11 中将xmlChar * 转换为std::wstring 的谨慎 方法是否是通过类似这样的方式使用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 的编号;我知道这不是 characters 的数量,而是unsigned char 的数量。如果我将它命名为byteLength,它会不会那么混乱,但我认为它会更清晰,因为我同时拥有charLength 和wcharLength。至于代码的正确性,wideBuffer 将始终大于或等于 以保持缓冲区所需的大小(我相信)。因为比wide_t 需要更多空间的字符将被截断(我认为)。
【问题讨论】:
-
如果您想谈论最谨慎的做法,请避免同时使用
wchar_t和wstring。使用 Unicode 时,它们弊大于利。
标签: c++ string unicode libxml2