我在嘗試使用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