我在尝试使用UTF8和Poco::XML::XMLWriter
时遇到问题。在下面的代码示例中,当输入包含ASCII字符时,一切正常。但是,有时wordmapIt->first
中的字符串包含非ASCII值,例如字符串中间出现的字符-105。当发生这种情况时,xml流似乎终止于-105 char,即使在此之后还有许多其他单词。我想保存任何字符串,所以只是删除字符不是正确的答案 - 这些都是我可以应用的某种编码(我认为),但是什么?在C++中使用带有UTF8字符串的Poco XMLWriter
我明显错过了一些概念上的东西,但对于我的生活我无法找出正确的方式来做到这一点。
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();
}
完美!非常感谢。我的困惑已经出现了,因为我从IE浏览器中删除了一些字符串,并在想“网页是utf8,所以最新的问题是什么?但正如你指出的那样,字符串是一个cp1252编码的字符串。按照您的建议使用TextConverter将cp1252映射到utf8是正确的结果。林编辑我的问题来包含答案,因为找到这个东西的例子是一个拖动。 – 2010-10-25 12:52:07