FreeType2 と iconv と wcstombs

ビットマップフォントを作るために必要なので、表題のものを使ってみた。


FreeTypeSDL_ttf 経由でしか使ったことなかったが、使い方自体はあんまり変わらない感じだった。
一応、チュートリアルのリンクだけ貼っとこう。


http://freetype.sourceforge.net/freetype2/documentation.html


wcstombs を使う前に、下記のように setlocale を呼ばないと日本語の変換ができない。
私の環境(Fedora 10)では、ja_JP.utf8 を使う。


例)
setlocale(LC_CTYPE, "ja_JP.utf8");


if (wcstombs(s, ws, sizeof(s)) == -1)
{
    // error
}


半角英数字だけなら setlocale を呼ばなくても別に良いのだが、日本語環境で使いたいときに呼び忘れると、残念な結果になる。


iconv は使用エンコーディングさえ間違えなければOKなのだが、使い方をよく忘れるので、コードを貼り付けとく。


iconv_t cd;
cd = iconv_open("SHIFT_JIS", "UTF-8");


if (cd == (iconv_t)-1)
{
    // error
}


char* ps1 = &s1[0];
char* ps2 = &s2[0];
size_t inbufleft = strlen(ps1);
size_t outbufleft = sizeof(s2);


if (iconv(cd, &ps1, &inbufleft, &ps2, &outbufleft) == -1)
{
    // error
}


iconv_close(cd);




・iconv 対応のエンコーディング
[jaianism@localhost ~]$ iconv --list


・wcstombs 対応のロケール
[jaianism@localhost ~]$ locale -a


【追記】
生の FreeType は日本語周りの制御が面倒臭くなるようだ。
マルチバイト文字が UTF-8 で固定されてしまうが、やっぱり SDL_ttf を使うことにして、Windows 環境では iconv で変換をかけることにしよう。
そっちのほうが簡単だ。


↓何バイト文字か判別する処理(UTF-8


if (text[n] <= -0x09 && text[n] >= -0x10)
{
    // 4バイト文字
}
else if (text[n] <= -0x11 && text[n] >= -0x20)
{
    // 3バイト文字
}
else if (text[n] <= -0x21 && text[n] >= -0x40)
{
    // 2バイト文字
}
else
{
    // 1バイト文字
}