Использование Poco XMLWriter со строками UTF8 в C ++ - PullRequest
3 голосов
/ 25 октября 2010

У меня проблема с попыткой разобраться с использованием UTF8 с Poco::XML::XMLWriter.В следующем примере кода все работает нормально, когда ввод содержит символы 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();
}

1 Ответ

1 голос
/ 25 октября 2010

Звучит так, как будто у вас есть строка байтов в кодировке кодовой страницы Windows 1252 .«Символ -105», по-видимому, действительно означает байт 0x97, который будет отображаться в символ Unicode U + 2014 Em Dash () в cp1252.

Я не знаком с Poco, но я думаю, выОжидается, что вы преобразуете ваши строки cp1252 в выходную кодировку UTF-8, используя TextConverter с Windows1252Encoding и UTF8Encoding.

Хотя, если у вас действительно есть «строка ANSI» (строка байтов вкодовая страница по умолчанию для локали текущего компьютера), 1252 может быть неправильным ответом, и вам, возможно, придется использовать функцию из другой библиотеки для правильного преобразования.

...