コレ絡み → [C++] UTF-8
ちょいと遅れましたが、先週金曜(12/05)東京タワーの根元にある
機械振興会館で C++ Working Group AdHoc会議 ちゅーのがありました。
いつもの会議は年に数回、C++標準委員会の委員が集まるんですが、
今回のAdHoc会議は一般から有志を募り、来るべきC++0xの仕様に
ついていちゃもんつけよう! って趣旨。 あらかじめ提出されたC++0xの
草案に対するコメントをひとつずつ検討し、上層部に投げるか否かを
決めるっちゅーもんです。
われらわんくま同盟からもなんかそれっぽいヒトが顔出してくれました。
C++標準委員会の名ばかり委員として深く御礼申し上げます。
モメるだろなーと思ってて案の定モメたのが文字コードのおはなし。
たとえば、ですね。
FILE* fp = fopen("日本語.txt","rt");
あるいは
std::ifstream file("日本語.txt");
これ、現在のC/C++では正しく 日本語.txt が
オープンできる保証はどこにもないんです。少なくとも言語仕様としては。
コンパイラ/ライブラリ屋さんがちゃんとオープンできるようになんとかしてくれてるだけ。
というのも、文字列(char*,char[],"で囲ったリテラル)は
もともとsingle-byte文字(ASCII)ベースなわけで、
そん中にmulti-byte文字列が格納されたとき、
その文字コードについて言語仕様は一言も言及していません。
コード上に書かれた "日本語.txt" がファイル名/パス名として正しく
機能するには、コンパイラが生成する文字列の文字コードと
ファイルシステム(OS-API)が受理するそれとを一致させにゃならん
のですが、言語仕様には触れられていません。
UNICODE(wchar_t)使えばいいわけだけど、そいつのコード上の表現は
L"日本語.txt" みたいにアタマに L が付きます。
なので、ファイル絡みの関数は wchar_t* をパス名として受け付ける版
が必要となります。
ところが、現在の標準ライブラリ仕様には char* 版しか用意されていないんですわ。
もうね、いっそ「コード中に現れるmulti-byte文字列はUTF-8である!」って
言語仕様でゆっちゃえば楽になるわけだけど、そーすっと今まで書かれてきた
あらゆるコードとコンパイラが仕様から外れ、下位互換性が保てなくなる。
いぢりたくてもいぢれないっつーわけ。