8.3 hack

Boost.Filesystemで見つけた面白いテクニックをご紹介。
C++標準のfstreamはコンストラクタやopen()メンバ関数の引数として、ナロー文字列を受け取ります。通常、この方法で扱うことのできるファイル名に使える文字はASCIIの英数字、記号、そして環境依存のマルチバイト文字です。日本語Windowsではマルチバイト文字のコードページとしてShiftJISを使うため、ファイルシステムが扱うことのできるファイル名の一部しか表現できません。
一方、NTFSが登場した頃はあらゆるファイルをMS-DOSからも扱える必要があったのだと思います。MS-DOSとの互換性のために残された8.3形式のファイル名はロングファイル名だけでなく、アクティブなコードページで表現できないファイル名に対しても用意されています。例えば、(MLに投稿した例は微妙に間違っていました)

你好.txt -> 好D0E7~1.TXT
你.txt -> 7464~1.TXT

といった具合です。つまり、8.3ファイル名を使えばfstreamで任意のファイル名を扱うことができるのです。なお、8.3ファイル名自体はGetShortPathName()関数で取得できます。

こういうMSの互換性への執着を見ると、Radium Software Developmentの記事を思い出します。
http://www.radiumsoftware.com/0406.html#040624
http://www.radiumsoftware.com/0509.html#050901
いやはや、金持ちな会社はやることが違いますね。