Irrlicht 1.6にはFileOpenDialogにANSIベースのマルチバイトパッチ#2450094が適用され、日本語表示が可能になっています。ですが、このパッチは残念なことにIrrlicht 1.5ベースまでしか対応していません。Irrlicht 1.6では文字化けしてしまいます。原因は、FileSystemの大幅改造により、CFileList.cppとCFileSystem.cppの処理が変わってしまったことにあります。
Irrlicht 1.6、「開発」の文字が「核発」と化ける (twitpic画像消失)
次のコードをご覧下さい。マルチバイト文字を考慮していない関数が2つ使われています。
CFileList.cpp u32 CFileList::addItem(const io::path& fullPath, u32 size, bool isDirectory, u32 id) { //... entry.Name.replace('\\', '/'); //... if (IgnoreCase) entry.Name.make_lower(); CFileSystem.cpp io::path& CFileSystem::flattenFilename(io::path& directory, const io::path& root) const { directory.replace('\\', '/'); //... IFileList* CFileSystem::createFileList() { //... Path.replace('\\', '/');
1つはmake_lower()関数です。これは日本語のShift-JIS文字列内にあるアルファベットと同じ値を、強制的に小文字に変換してしまいます。そのため、"開発"と言う文字が"核発"に化けてしまうのです。文字コードの対応は次を参照して下さい。
make_lower()による日本語の強制文字化け (twitpic画像消失)
2つ目はreplace('\\', '/')関数。上記と同じ問題を抱えています。"コンソール"と言うファイル名が、"ソ"に含まれる"\"(バックスラッシュ)コードの影響で、途中で分割されてしまいます。
replace()関数によってバックスラッシュがスラッシュに変換されてしまう (twitpic画像消失)
Shift-JISとバックスラッシュの関係 (twitpic画像消失)
この問題は、日本語の表示だけ上手く動くように修正しても、他の言語では不具合が残ってしまい、根本的な解決にはならないでしょう。Irrlichtの国際化のためには、ANSIからUnicodeベースへの転換が必要ではないでしょうか。試しに_IRR_WCHAR_FILESYSTEMをON、VC2008のUnicodeフラグを立てて、Irrlichtをコンパイルしてみました。コンパイルエラーが多く修正に手間取りましたが、Unicodeベースでは正常な動作を確認しました。
UnicodeベースのIrrlichtでは日本語処理も正常 (twitpic画像消失)
既にこのことは開発チームも認識しております。開発リポジトリにはWindowsでUnicodeコンパイルが可能になるような修正が、ある程度、施されました。他の処理系やOSへの影響も考えなければなりませんが、徐々に国際化対応が進んで使い勝手が良くなることでしょう。