- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题与这个未回答的问题相同?
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,获取 ->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/
我正在使用 RapidXML 读取 XML 文件、解析它、执行一些操作并将其写回。 标签内任何用引号书写的文本,都以扩展形式用引号打印。 是否有任何标志可以防止引号和其他特殊字符的扩展。 欢迎任何建议
今天我试图从我的项目中查找内存泄漏然后我遇到了下面的示例代码 std::string VersionValue("1.0"); std::string EncodingValue("UTF-8");
我最近一直在使用 Rapidxml 并遇到了以下问题。当我尝试添加属性时,这些属性不是硬编码的,而是在程序运行时生成的,rapidxml 插入了错误的字符。 这是我的代码示例: void Pro
我是 rapidXML 的新手,但第一印象并不积极,我制作了简单的 Visual Studio 6 C++ Hello World 应用程序并将 RapidXML hpp 文件添加到项目和 main.
ifstream fin("tree.xml"); if (fin.fail()) return 1; fin.seekg(0, ios::end); size_t lengt
我过去使用 RapidXML 时遇到了几个问题,但这个问题让我很困惑。 我正在创建应用程序事件时间戳的日志,外部程序可以在重播中读取在正确时间发生在原始应用程序中的任何音频。 在应用程序初始化时,会正
因此,我最近掌握了 RapidXML,将其用作在我的程序中解析 XML 的一种方式,我一直主要将其用作一种乱七八糟的方式,但我遇到了一些非常奇怪的问题,我真的很挣扎追查。试着和我一起解决这个问题,因为
我正在使用 RapidXML 来解析一个 xml 字符串。这是我的字符串: std::string str(" 2016-10-18T08:51:50.657+01:0000 "); 下面是我尝试解析
我试图以一种肮脏的方式使用 rapidxml 附加一个非常大的子树,利用 value 方法 rapidxml::xml_node<>* node = allocate_node(rapidxml::n
因此,在 RapidXML 中,我试图遍历我的文件以从某些 tileset 节点获取数据: rapidxml::xml_node<> *root_node = doc.first_node("map"
我正在使用 RapidXML 解析一个 xml 文件,其中包含一些我想在我的 C++ 程序中使用的变量。我能够读取有效节点,但我想添加一些错误处理,例如,如果节点名称拼写错误。 这是我的文件的一个工作
我在 PC 上的 VS2012 中使用 rapidXML 和 C++。我已经解析了 XML 文件,但现在我想单独打印出属性值。我通常可以使用下面的代码来做到这一点。但是,此方法需要知道节点名称和属性名
使用 RapidXML 我需要创建和销毁大量 XML 节点和 XML 属性。我在内存池文档中读到,没有办法使用 allocate_string 函数释放在内存池中创建的单个字符串。 但是这样内存池的大
RapidXml 的文档说 Pool maintains RAPIDXML_STATIC_POOL_SIZE bytes of statically allocated memory. Until s
我在使用 RapidXML 解析字符串时遇到了一些问题。我从 Eclipse 中收到一个错误,声称解析函数不存在。 make all Building file: ../search.cpp Invo
我有一个非常恼人的问题,我花了很多时间来解决它。我在 C++ 中使用 rapidXML 来解析 XML 文件: xml_document<> xmlin; stringstream input; //
我自己研究了 rapidXML 源代码并设法读取了一些值。现在我想更改它们并将它们保存到我的 XML 文件中: 解析文件并设置指针 void SettingsHandler::getConfigFil
我在我的一个项目中一直在使用 RapidXML。一切都很顺利,直到我决定用它来写出 xml。我的代码或多或少如下: //attempt to open the file for writing std
我正在尝试使用 C++ 应用程序中的 RapidXML 库在控制台中打印 XML 文档数据。 我正在遵循 RapidXML 手册 link here ,但我遇到了编译时错误。 这是我的 C++ 代码:
我有一个 XML 文件,我应该使用 RapidXML 和 C++ 对其进行解析。该文件是系统发育树。每个节点都有一个包含 1-3 个子节点的节点,每个子节点都有值。节点可以是学名、通用名或等级。我的问
我是一名优秀的程序员,十分优秀!