gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:52:16 27 4
gpt4 key购买 nike

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

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() 函数返回值的最佳方法是什么?

提前致谢。

最佳答案

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

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

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

但是,因为它是 Windows,所以您有(远程)机会需要将宽字符数组传递给 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);

关于c++ - 如何使用 rapidxml 从 xml 中读取 utf-8 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19120032/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com