如何使用rapidxml从xml读取utf-8字符串?

时间:2013-10-01 15:20:32

标签: c++ visual-studio-2010 rapidxml

我的问题与这个悬而未决的问题相同吗?

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字符串并不像预期的那样。他们是腐败的角色。

我的问题是:

  1. 如何使用rapidxml读取Unicode / Utf-8值?
  2. 还有更简单的xml解析器可以做同样的事情吗?
  3. 任何示例代码都将深受赞赏。
  4. 在第2.1节here中提到了

    请注意,RapidXml不执行解码 - name()返回的字符串和value()函数将包含使用与源文件相同的编码编码的文本。

    如果我的XML编码是UTF-8,获取 - &gt; value()函数返回值的最佳方法是什么?

    提前致谢。

1 个答案:

答案 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);