ごめん嘘ついた

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が入る

としなければいけません。