在C ++中使用Poco XMLWriter和UTF8字符串

时间:2010-10-25 11:31:49

标签: c++ xml poco

我在尝试使用带有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();
}

1 个答案:

答案 0 :(得分:1)

听起来你有Windows code page 1252编码的字节字符串。 “字符-105”可能实际上意味着字节0x97,它将映射到cp1252中的Unicode字符U + 2014 Em Dash()。

我不熟悉Poco,但我猜你应该使用带有Windows1252Encoding和UTF8Encoding的TextConverter将你的cp1252字符串转换为UTF-8输出编码。

虽然你真正拥有的是“ANSI字符串”(当前机器的语言环境的默认代码页中的字节字符串),但1252可能不是正确的答案,你可能不得不使用另一个库中的函数来正确地进行转换。