2016-06-02 14 views
0

Ich benutze boost.log, um Multi-Log-Datei nach String-Wert zu erstellen. Wenn die Zeichenfolge jedoch UTF8-codiert ist, hat die erstellte Datei einen falschen Namen (wie folgt: è ° .æ|ç).boost.log Problem beim Erstellen einer Datei mit einem UTF8-Dateinamen

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); 

Wie boost.log den UTF8-Dateinamen verarbeiten kann?

Antwort

0

Boost.Log erstellt den Dateinamen in der Codierung, die für das zugrunde liegende Betriebssystem nativ ist. Unter Windows ist der Dateiname eine UTF-16-Zeichenkette (der Zeichentyp ist wchar_t), auf den meisten POSIX-Systemen ist es normalerweise UTF-8 (der Zeichentyp ist char).

Um den Dateinamen in der systemeigenen Codierung zu erstellen, erstellt der Adapter as_file_name_composer einen Stream, der die Zeichencodeumwandlung nach Bedarf ausführt, wenn der angepasste Formatierer aufgerufen wird. Dadurch können Sie im Formatierungsprogramm sowohl schmale als auch breite Zeichenfolgen verwenden, solange die Codierung in die native konvertiert werden kann. Sie müssen jedoch wissen, dass für die gleichen typisierten Strings die gleiche Kodierung gilt. Wenn also die native Multibyte-Kodierung UTF-8 ist, müssen alle Ihre schmalen Strings auch UTF-8 sein. Wenn der Zeichencode konvertiert wird, verwendet der Stream ein Gebietsschema, das Sie als zweites Argument für as_file_name_composer angeben können. Standardmäßig ist das Gebietsschema standardmäßig aufgebaut. Wenn das standardmäßig erstellte Gebietsschema nicht UTF-8 ist, führt die Konvertierung zu einem falschen Ergebnis, was meiner Meinung nach der Fall ist. Sie müssen entweder Ihr globales Gebietsschema als UTF-8 einrichten oder ein UTF-8-Gebietsschema erstellen und es an den Adapter as_file_name_composer übergeben. Sie können einfach Boost.Locale verwenden, um ein UTF-8-Gebietsschema zu erstellen.