Raspberry PiとopenFrameworksで日本語TrueTypeFont


ofxTrueTypeFontUCを使ってRaspberryPi+openFrameworksで日本語を描画しようとしてみたけどうまく表示されず。

drawString内でconvToUTF32を使ってUTF-8から変換してるところを置き換えたら表示されたから、convToUTF32関数の問題っぽい。

ofxTrueTypeFontUC.cpp
void ofxTrueTypeFontUC::drawString(const string &src, float x, float y){
  if (!mImpl->bLoadedOk_) {
    ofLog(OF_LOG_ERROR,"ofxTrueTypeFontUC::drawString - Error : font not allocated -- line %d in %s", __LINE__,__FILE__);
    return;
  }

  GLint index   = 0;
  GLfloat X = x;
  GLfloat Y = y;

  basic_string<unsigned int> utf32_src;//convToUTF32(src);
  utf32_src += 0x00003042;//あ
  utf32_src += 0x00003042;//あ
  utf32_src += 0x00003042;//あ

  int len = (int)utf32_src.length();
  int c, cy;

  while (index < len) {
    (...)

convToUTF32で受け取ってる文字列を試しに出力してみたら、なんとShift_JIS。

ofxTrueTypeFontUC.cpp
static const basic_string<unsigned int> convToUTF32(const string &utf8_src){
  basic_string<unsigned int> dst;


  // convert UTF-8 -> UTF-32 (UCS-4)
  int size = utf8_src.size();
  int index = 0;
  for (int i = 0; i < size; i++) {
      wchar_t c = (unsigned char)utf8_src[i];
      printf("convToUTF32,%d: 0x%04x\n", i, c);
  }
  while (index < size) {
    (...)

ofApp.cpp
void ofApp::draw(){
  mainFont.drawString("hogeあぁい", 900, 100);
}
出力
convToUTF32,0: 0x0068
convToUTF32,1: 0x006f
convToUTF32,2: 0x0067
convToUTF32,3: 0x0065
convToUTF32,4: 0x0082
convToUTF32,5: 0x00a0
convToUTF32,6: 0x0082
convToUTF32,7: 0x009f
convToUTF32,8: 0x0082
convToUTF32,9: 0x00a2

ofApp.cppをUTF-8で保存してあげるとうまくいきました。
Visual Studioでは、「名前を付けて保存」->「上書き保存」の右の小さい三角->「エンコード付きで保存」です。