【问题标题】:How to read a utf-8 string from an xml using rapidxml?如何使用 rapidxml 从 xml 读取 utf-8 字符串?
【发布时间】:2013-10-01 15:20:32
【问题描述】:

我的问题与这个未回答的问题相同?

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. 任何示例代码都将不胜感激。

在第 2.1 节here 中提到了

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

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

提前致谢。

【问题讨论】:

  • 您是否阅读过文档的第 1.2 节 rapidxml.sourceforge.net/…?似乎如果你想做 UTF-8 到 UTF-16 的转换,你必须自己做。但这并不难。
  • john : 请检查我的编辑
  • 由于您使用的是 Windows,我想将 UTF-8 转换为 UTF-16 的最简单方法是使用 Windows 函数 MultiByteToWideChar。你可以在互联网上找到很多这样的例子。

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


【解决方案1】:

请记住,RapidXML 是一个“原位”解析器:它解析 XML 并通过在正确的位置(和其他东西)添加空终止符来修改内容。

所以value() 函数实际上只是将一个 char * 指针返回到您的原始数据中。如果那是 UTF-8,那么 RapidXML 返回一个指向 UTF-8 字符串的指针。换句话说,你已经在做你在问题标题中要求的事情了。

但是,在您发布的代码 sn-p 中,您希望将 wchar_t 存储在结构中。首先,由于内存所有权问题,我建议您根本不要这样做。记住,你打算使用 C++,而不是 C。如果你真的想存储一个原始指针,为什么不使用你已经拥有的 UTF-8 呢? http://www.utf8everywhere.org/

但是,因为它是 Windows,所以有一个(远程)机会,您需要将一个宽字符数组传递给 API 函数。如果是这样,您需要使用 OS 函数 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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    相关资源
    最近更新 更多