とりあえず日本語との戦いから

(Irrlicht-1.5.1を使用)

チュートリアルをこなしていたらどうしても気になったのでまずは日本語の対処方法から。


こちらのチュートリアルでまずはFreeTypeでttfフォントを使うのをラーニング。
http://www.zgock-lab.net/irrlicht/tut06.htm
これで文字列をリテラル

irr::core::stringw=L"こんちは世界";

というような自分で作った文字列は問題なく表示できた。


次に、本家のチュートリアル
http://irrlicht.sourceforge.net/docu/example005.html
と組み合わせてみる。


ファイルダイアログが文字化けしてしまう。
ファイルシステムに由来する文字列の処理がよろしくないらしい。
調べたところ、CFileList.cppでopendirで得た文字列をutf-8として処理していないことがわかった。(というかAscii/Latin-1決め打ち。include/irrString.hの先頭に関連コメントあり)。


CGUIFileOpenDialog.cppを改造(utf-8に決め打ち。Windowsではたぶんcp932用に書く必要がある)

// 先頭の方に追加
#include <string>
#include <vector>
static
std::wstring utf8_to_unicode(const std::string &text)
{
  std::vector<wchar_t> buf;
  std::string::const_iterator it=text.begin();
  while(it!=text.end()){
    unsigned char byte=static_cast<unsigned char>(*it);
    int unicode=0;
    if(byte<0x7F){
      unicode=byte;
      ++it;
    }
    else if(byte<=0xCF){
      unicode=((byte&0x1F)<<6);
      ++it;
      unicode+=(static_cast<unsigned char>(*it) & 0x3F);
      ++it;
    }
    else if(byte<=0xEF){
      unicode+=((byte&0x0F)<<12);
      ++it;
      unicode+=(static_cast<unsigned char>(*it) & 0x3F)<<6;
      ++it;
      unicode+=(static_cast<unsigned char>(*it) & 0x3F);
      ++it;
    }
    else{
      assert(false);
    }
    buf.push_back(unicode);
  }
  return std::wstring(buf.begin(), buf.end());
}

// 300行あたり
// s = FileList->getFileName(i);
s = utf8_to_unicode(FileList->getFileName(i)).c_str();

動作。

やっつけなので一部しかなおってないがとりあえずファイルは選べる。

1.6

ではまた違う問題があるらしい
http://etwas.wolfish.org/blog/2009/10/26/2009102601/