UTF-16の読み込みは安定したみたいですので、UTF-8をリビューします。
現在UTF-8はBOM(0xEF、0xBB、0xBF)付とBOM無しの何れも読めるようにする仕様で、変換は(コンストラクターでSetLocaleを実行し)MultiByteToWideChar関数(注)の二度使いで1パスでワイド文字列長を得、2パスで実際に変換するようにしています。
注:この関数の第4引数であるint cbMultiByteを-1にして、NULL終端付文字列として使っています。従って、1パスで返される文字列長は最終のNULLが含まれることを実際に実験して確認しています。
現在WCEditorで読み込み実験(注)をすると、
(1)UTF-16ファイルは正常に読み込みます。
(2)BOM付UTF-8も正常に読み込みます。
(3)その後、BOM無UTF-8を読み込むと文字化けします。再度BOM無UTF-8ファイルを読むと正常に読み込めます。(最初の一回だけ文字化けするようです。)
(4)UTF-8で、長いファイルを読んだ後、短いファイルを再度読み込むと、そのファイルのお尻に前のファイルのゴミがそのまま残ります。(読み込みバッファはBYTE配列を動的に確保しており、最後に開放しているのですが...また、新しく読み込んだファイルのNULL終端が無いことも謎です。)
という症状が残ります。
注:デバグ検証のために、サクラエディタ―でBOM付UTF-16、BOM付UTF-8、BOM無UTF-8のサンプルファイルを二つづつ作り、これを読み込んだり、読み込んだ文字列をかき出して実験しています。
まぁ、気長に仮定と実験で対処してゆくことにします。