
Recently, I needed to fix a program to work properly with paths that cannot be represented by narrow strings under Windows. The problematic filenames came from the user via drag and drop. I tried to go the wstring route, the same approach that the filesystem library takes; but it was harder than I thought. Many parts of the code base assumed narrow paths. At the end I reverted the changes and just encoded the wide path into UTF-8 at the very start, passed the UTF-8 string through the existing code, then decoded the UTF-8 into a wstring at the very end, immediately before calling the Windows API. It worked. What this means in the [filesystem] context? Basically, instead of: template<class String, class Traits> class basic_path; I used something similar to: class path { private: string data_; // UTF-8, exposition only public: path( wstring const & s ); path( string const & s, encoding_type encoding = system_default ); wstring to_wstring() const; string to_string( encoding_type encoding = system_default ) const; }; -- Peter Dimov http://www.pdimov.com