2015-01-09 2 views
4

Я пытаюсь читать/писать XML-файл, используя функции Boost read_xml и write_xml. Исходная кодировка файла XML - «windows-1252», но после операций чтения/записи кодировка стала «utf-8».Boost XML-файл для чтения/записи: как изменить кодировку символов?

Это XML исходный файл:

<?xml version="1.0" encoding="windows-1252" standalone="no" ?> 
<lot> 
    <name>Lot1</name> 
    <lot_id>123</lot_id> 
    <descr></descr> 
    <job> 
    <name>TEST</name> 
    <num_items>2</num_items> 
    <item> 
     <label>Item1</label> 
     <descr>Item First Test</descr> 
    </item> 
    <item> 
     <label>Item2</label> 
     <descr>Item Second Test</descr> 
    </item> 
    </job> 
</lot> 

И это выход один:

<?xml version="1.0" encoding="utf-8"?> 
<lot> 
    &#10;&#10; &#10;&#10; &#10;&#10; &#10;&#10; &#10;&#10; &#10;&#10; &#10;&#10; &#10;&#10; 
    <name>Lot1</name> 
    <lot_id>123</lot_id> 
    <descr></descr> 
    <job> 
    &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; &#10; 
    <name>TEST</name> 
    <num_items>2</num_items> 
    <item> 
     &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  
     <label>Item1</label> 
     <descr>Item First Test</descr> 
    </item> 
    <item> 
     &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  &#10;  
     <label>Item2</label> 
     <descr>Item Second Test</descr> 
    </item> 
    </job> 
</lot> 

Это мой C++ код (только тест-код):

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 
using boost::property_tree::ptree; 

ptree xmlTree; 
read_xml(FILE_XML, xmlTree); 

for (auto it = xmlTreeChild.begin(); it != xmlTreeChild.end();) 
{ 
    std::string strItem = it->first.data(); 
    if (strcmp(strItem.c_str(), "item") == 0) 
    { 
     std::string strLabel = it->second.get_child("label").data(); 
     if (strcmp(strLabel.c_str(), "item3") != 0) 
     { 
      it = xmlTreeChild.erase(it); 
     } 
    }  
    ++it; 
} 

auto settings = boost::property_tree::xml_writer_make_settings<std::string>('\t', 1); 
write_xml(FILE_XML, xmlTree, std::locale(), settings); 

Мне нужно прочитать и переписать файл, используя ту же кодировку из исходного файла. Я попытался также изменить региональные настройки, с помощью:

std::locale newlocale1("English_USA.1252"); 
read_xml(FILE_XML, xmlTree, 0, newlocale1); 
... 
auto settings = boost::property_tree::xml_writer_make_settings<std::string>('\t', 1); 
write_xml(FILE_XML, xmlTree, newlocale1, settings); 

, но я получил тот же результат.

Как я могу читать и писать, используя исходную кодировку файлов, с функциями Boost?

Спасибо

ответ

0

Вы можете пройти кодирование с помощью настроек писателя:

auto settings = boost::property_tree::xml_writer_make_settings<std::string>(
    '\t', 1, "windows-1252"); 

Конечно, убедитесь, что ключ/значения на самом деле latin1/cp1252 совместимы (это имеет смысл до тех пор, как вы прочитайте всю информацию из исходного файла, однако вам необходимо позаботиться о том, чтобы, например, назначить вход пользователя в узел дерева свойств, вам может потребоваться сначала преобразовать из входной кодировки в cp1252).

Live On Coliru

0

Вы также можете написать в строку потока следующим образом:

#include <boost/property_tree/ptree.hpp> 
#include <boost/property_tree/xml_parser.hpp> 

boost::property_tree::ptree pt; 
std::ostringstream oss; 
write_xml(
    oss, pt, 
    boost::property_tree::xml_writer_make_settings<char>(
        '\t', 0, "ASCII")); 
Смежные вопросы