boost::filesystem::pathの改造

Windowsの場合、UTF-8でパス名を持つように書き換えてみた。
http://www89.sakura.ne.jp/~janus/distribution/boost_filesystem_utf8.zip
path_posix_windows.cppのほうは書き換えた位置をアスタリスク連打コメントで囲ってあるので、気になる方は検索しながら見てください。operation_posix_windows.cppはnative_file_string()関数を使うようにしただけです。一応テストはして変な副作用が出てないことは確認済みだけど、いくつか注意点が。

  • string()メンバ関数ではなく、native_file_string()/nutive_directory_string()メンバ関数を使わないといけない(string()メンバ関数はパス名を格納したstd::stringオブジェクトへの参照を返すので、UTF-8のままで返ってくる)。
  • branch_path()/relative_path()メンバ関数等は、UTF-8-->システムデフォルト文字コード-->UTF-8と変換をおこなっているので、若干重いかも。
  • Windows CEではこのままでは動かない(WideCharToMultiByte()でコードページ指定にCP_UTF8を指定しているが、CEではこの指定をサポートしていない)。CEでも使いたいよー、って人はRFCを参照しながら変換ルーチンを書くとかしてください(ぉ。
  • WindowsだけどUS-ASCIIしか使わないことがわかってる場合はUTF-8の変換/逆変換が無駄なので使わないほうがいい。

一応0x5c(0x7c)問題は解消できてます。"弓道部レギュラー表.csv"とか食わせても平気b

最後に代替案だったけどポシャったモノを。

  • マルチバイト文字ベースなアプローチ。IsDBCSLeadByte()で検査しながらパス名を格納する。leaf()やbranch_path()といったdecomposition関数で0x5c問題が発生するので無理。
  • ワイド文字ベースなアプローチ。パス名を持つメンバ変数をstd::wstringにしてしまう。ヘッダファイルを書き換えるのは好ましくない。というかPOSIX処理系では別にワイド文字で持つ必要はない。よって却下。