2010-10-25 84 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