boost.log问题创建一个UTF8文件名的文件

时间:2016-06-02 10:37:20

标签: c++ utf-8 boost-log

我使用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文件名?

1 个答案:

答案 0 :(得分: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语言环境。