2016-06-02 2 views
0

Я использую boost.log для создания файла с несколькими логами в соответствии со строковым значением. Но когда строка кодируется UTF8, созданный файл имеет неправильное имя (например: è ° .æ|ç).boost.log проблема с созданием файла с именем UTF8

BOOST_LOG_SCOPED_LOGGER_ATTR(Logger::motion_checker, "RoleName", boost::log::attributes::constant<std::string>(name)) 

typedef boost::log::sinks::asynchronous_sink<boost::log::sinks::text_multifile_backend> multifile_sink; 
boost::shared_ptr<multifile_sink> sink(new multifile_sink); 
sink->locked_backend()->set_file_name_composer(boost::log::sinks::file::as_file_name_composer(
    boost::log::expressions::stream << "./log/MotionCheck/" << boost::log::expressions::attr<std::string>("RoleName") << ".log")); 
sink->set_formatter 
    (
     boost::log::expressions::format("[%1%] - %2%") 
     % boost::log::expressions::attr<boost::posix_time::ptime>("TimeStamp") 
     % boost::log::expressions::smessage 
     ); 
sink->set_filter(channel == motion_check_channel); 
core->add_sink(sink); 

Как включить boost.log обрабатывать имя файла UTF8?

ответ

0

Boost.Log составляет имя файла в кодировке, которая является родной для базовой операционной системы. В Windows имя файла является строкой UTF-16 (тип символа - wchar_t), на большинстве систем POSIX обычно это UTF-8 (тип символа - char).

Для создания имени файла в исходной кодировке адаптер as_file_name_composer создает поток, который выполняет преобразование символьного кода по мере необходимости при активации адаптированного форматирования. Это в основном позволяет использовать как узкие, так и широкие строки в форматировании, если кодировка может быть преобразована в исходную. Вы должны знать, что предполагается, что строки с одинаковым типом имеют одинаковую кодировку, поэтому, если нативная многобайтовая кодировка является UTF-8, то все ваши узкие строки также должны быть UTF-8.

При преобразовании кода символа поток использует локаль, которую вы можете предоставить в качестве второго аргумента для as_file_name_composer. По умолчанию локаль построена по умолчанию. Если ваш построенный по умолчанию языковой стандарт не UTF-8, то преобразование приведет к некорректному результату, который, я думаю, является тем, что происходит. Вы должны либо настроить свой глобальный язык как UTF-8, либо создать локаль UTF-8 и передать ее в адаптер as_file_name_composer. Вы можете использовать Boost.Locale, чтобы легко генерировать язык UTF-8.

 Смежные вопросы

  • Нет связанных вопросов^_^