我在尝试使用带有Poco::XML::XMLWriter
的UTF8时遇到了问题。在下面的代码示例中,当输入包含ASCII字符时,一切正常。但是,有时wordmapIt->first
中的字符串包含非ASCII值,例如字符串-105中出现的字符。当发生这种情况时,xml流似乎终止于-105 char,即使在此之后还有许多其他单词。我想保存那里的任何字符串所以只是剥掉char不是正确的答案 - 这是我可以应用的某种编码(我认为)但是什么?
我显然在概念上遗漏了一些东西,但对于我的生活,我无法找到正确的方法来做到这一点。
Poco::XML::XMLString EDocument::makeXMLString()
{
std::stringstream xmlstream;
Poco::UTF8Encoding utf8encoding;
Poco::XML::XMLWriter writer(xmlstream, 0, "UTF-8", &utf8encoding);
writer.startDocument();
std::map<std::string, std::string>::iterator wordmapIt;
for ( wordmapIt = nodeinfo->wordmap.begin(); wordmapIt != nodeinfo->wordmap.end(); wordmapIt++ )
{
writer.startElement("", "", "word");
writer.characters(Poco::XML::toXMLString(wordmapIt->first));
writer.endElement("", "", "word");
}
writer.endDocument();
return xmlstream.str();
}
编辑: 解决方案基于以下答案。
Poco::XML::XMLString EDocument::makeXMLString()
{
std::stringstream xmlstream;
Poco::UTF8Encoding utf8encoding;
Poco::XML::XMLWriter writer(xmlstream, 0, "UTF-8", &utf8encoding);
Poco::Windows1252Encoding windows1252encoding;
Poco::UTF8Encoding utf8encoding;
Poco::TextConverter textconverter(windows1252encoding, utf8encoding);
writer.startDocument();
std::map<std::string, std::string>::iterator wordmapIt;
for ( wordmapIt = nodeinfo->wordmap.begin(); wordmapIt != nodeinfo->wordmap.end(); wordmapIt++ )
{
std::string strword;
textconverter.convert(wordmapIt->first, strword);
writer.startElement("", "", "word");
writer.characters(strword);
writer.endElement("", "", "word");
}
writer.endDocument();
return xmlstream.str();
}
答案 0 :(得分:1)
听起来你有Windows code page 1252编码的字节字符串。 “字符-105”可能实际上意味着字节0x97,它将映射到cp1252中的Unicode字符U + 2014 Em Dash(—
)。
我不熟悉Poco,但我猜你应该使用带有Windows1252Encoding和UTF8Encoding的TextConverter将你的cp1252字符串转换为UTF-8输出编码。
虽然你真正拥有的是“ANSI字符串”(当前机器的语言环境的默认代码页中的字节字符串),但1252可能不是正确的答案,你可能不得不使用另一个库中的函数来正确地进行转换。