【发布时间】:2011-04-30 04:06:29
【问题描述】:
我在尝试使用带有Poco::XML::XMLWriter 的UTF8 时遇到问题。在下面的代码示例中,当输入包含 ASCII 字符时一切正常。但是,wordmapIt->first 中的字符串偶尔会包含非 ASCII 值,例如出现在字符串中间的字符 -105。发生这种情况时,xml 流似乎在 -105 字符上终止,即使在此之后还有许多其他单词。我想保存那里的任何字符串,所以只是去掉字符不是正确的答案 - 必须有某种我可以应用的编码(我认为)但是什么?
我显然在概念上遗漏了一些东西,但在我的一生中,我无法找到正确的方法。
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();
}
【问题讨论】: