ごめん嘘ついた
boost::filesystemの改造について、directory_iteratorとoperator/=を考慮してなかったので修正age。
http://www89.sakura.ne.jp/~janus/distribution/boost_filesystem_utf8.zip
もひとつ注意点。例えば以下のコード、
namespace fs = boost::filesystem; fs::path p1("ディレクトリ\ファイル.txt", fs::native); fs::path p2("フォルダ", fs::native); fs::path p3 = p2 / p1.leaf(); // <--意図通りに働かない
はp3に"フォルダ\ファイル.txt"が入りそうですが、入りません。なぜかというとp1.leaf()はstd::stringを返し、operator/()は二つのboost::filesystem::pathオブジェクトを引数に取ります。このときp1.leaf()の部分はfs::path(p1.leaf())と解釈され、デフォルトのname_check functionであるportable_nameが選択されます。portable_nameでは[a-zA-Z0-9_-.]の文字しか許していないので、もちろんUTF-8文字列は通しません。というわけで以上のコードは明示的にnativeかno_checkを指定してboost::filesystem::pathオブジェクトを構築してやらなければいけなくて、
fs::path p3 = p2 / fs::path(p1.leaf(), fs::native); // フォルダ\ファイル.txtが入る
としなければいけません。