我的问题与这个悬而未决的问题相同吗?
How to read Unicode XML values with rapidxml
但我的XML内容是用UTF-8编码的。我是MS Visual Studio,C ++的新手。
我的问题是,我们如何将UTF-8字符串读入wchar_t类型字符串?
说,我定义了这样的结构,
typedef struct{
vector<int> stroke_labels;
int stroke_count;
wchar_t* uni_val;
}WORD_DETAIL;
当我从xml读取值时,我使用..
WORD_DETAIL this_detail;
this_detail.uni_val=curr_word->first_node("labelDesc")->first_node("annotationDetails")->first_node("codeSequence")->value();
但是存储的utf-8字符串并不像预期的那样。他们是腐败的角色。
我的问题是:
在第2.1节here中提到了
“请注意,RapidXml不执行解码 - name()返回的字符串和value()函数将包含使用与源文件相同的编码编码的文本。”
如果我的XML编码是UTF-8,获取 - &gt; value()函数返回值的最佳方法是什么?
提前致谢。
答案 0 :(得分:3)
请记住,RapidXML是一个“原位”解析器:它解析XML并通过在正确的位置(和其他东西)添加空终止符来修改内容。
因此value()
函数实际上只是将char *指针返回到原始数据中。如果是UTF-8,则RapidXML返回指向UTF-8字符串的指针。换句话说,你已经在问题标题中做了你要求的事情。
但是,在您发布的代码段中,您希望在结构中存储wchar_t
。首先,我建议你根本不要这样做,因为内存所有权问题。记住,你的意思是使用C ++,而不是C.如果你真的想存储一个原始指针,为什么不是你已经拥有的UTF-8呢? http://www.utf8everywhere.org/
但是,因为它的窗口有一个(远程)机会,你需要将宽字符数组传递给API函数。如果是这样,您将需要使用操作系统功能MultiByteToWideChar
将UTF-8转换为宽字符// Get the UTF-8
char *str = xml->first_node("codeSequence")->value();
// work out the size
int size = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
// allocate a vector for that size
std::vector<wchar_t> wide(size);
// do the conversion
MultiByteToWideChar(CP_UTF8, 0, str, -1, &wide[0], size);