【问题标题】:Using Poco XMLWriter with UTF8 strings in C++在 C++ 中使用带有 UTF8 字符串的 Poco XMLWriter
【发布时间】: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();
}

【问题讨论】:

    标签: c++ xml poco


    【解决方案1】:

    听起来你有一个Windows code page 1252 编码的字节字符串。 “字符 -105”大概是真正的字节 0x97,它会映射到 cp1252 中的 Unicode 字符 U+2014 Em Dash ()。

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

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

    【讨论】:

    • 完美!太感谢了。我的困惑出现了,因为我从 IE 中抓取字符串并在想“网页是 utf8 那么有什么问题?”但正如您指出的那样,该字符串是一个 cp1252 编码的字符串。按照您的建议使用 TextConverter 从 cp1252 映射到 utf8 是正确的结果。我正在编辑我的问题以包含答案,因为找到这些东西的例子很麻烦。
    猜你喜欢
    • 2011-05-22
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多