うん.なんていうかね.Boost.Serializationのutf8_codecvt_facet.hppとutf8_codecvt_facet.cppの実装を追ってたのよ.(RC枝から引っ張ってきたやつ)いやcoding変換の実装を追うのは楽しかったですよ?何せ実装が極めて素直だから,うにコード超初心者の自分でも教科書さえ手元にあれば「ああ,これはこれね」って感じだったもん.
問題はそこじゃねぇ.
このユーティリティ,std::codecvtなる標準のクラスから派生してる.恐らくこのstd::codecvtはただのインターフェース定義.このstd::codecvtから派生したutf8_codecvt_facet_wchat_tをfacetとして突っ込んだlocaleオブジェクト作って(std::codecvtはlocale::facetから派生してる),それでstreamをimbueすれば,入力時に「UTF-8 -> UCS-4」を,出力時に「UCS-4 -> UTF-8」のcoding変換を自動でやってくれるstreamのできあがりってわけね.要するにMBCSとワイド文字列の間の変換・逆変換を内部で自動でやってくれるストリームの出来上がり.これが標準C++準拠のストリームによるcoding変換のやり方(らしい).
そんなの超初耳.
っていうかさぁ,std::codecvtを始めとしたlocaleライブラリ群に関する記述なんて今まで読んだC++の参考書のどこひっくり返してもまともに載ってなかったんですけど?これについて一番記述量があるべきはずのTC++PLがlocaleライブラリの記述にたった2ページしか割いてないっていうのがそもそも間違ってるんじゃなくって?ぷんすかぷんっ!
#2004/10/30追記:TC++PL(第3版)にはlocaleに関する加筆分が出ていて,http://www.research.att.com/~bs/3rd_loc0.htmlから入手可能です.郵便はみがきさんありがとうございます.(下のコメント参照)
#2004/10/30追記:localeライブラリに関する記述がある書籍としてasin:4756137156.sylvaさんありがとうございます.(下のコメント参照)
で,怒り狂った勢いで以下をAmazonで注文.
asin:0201183951
#UCS-4の値をwchar_tに入れてるけれど,これ普通のWindows環境だと上位2バイトが切り捨てられるって解釈で良いのかにゃ?