Irrlicht 1.6のFileOpenDialogで日本語が化ける原因

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への影響も考えなければなりませんが、徐々に国際化対応が進んで使い勝手が良くなることでしょう。

Share