2010-10-25 103 views
3

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

回答

1

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

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

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

+0

完美!非常感谢。我的困惑已经出现了,因为我从IE浏览器中删除了一些字符串,并在想“网页是utf8,所以最新的问题是什么?但正如你指出的那样,字符串是一个cp1252编码的字符串。按照您的建议使用TextConverter将cp1252映射到utf8是正确的结果。林编辑我的问题来包含答案,因为找到这个东西的例子是一个拖动。 – 2010-10-25 12:52:07