StoryEdit 開発日誌

ウェブアプリ StoryEditを作ってましたが延期。普通のブログ。

Slick2d, UnicodeFontで日本語表示 〜その1〜

前回書いたTrueTypeFontはDeprecatedなので使用は推奨されない。UnicodeFontで使いたい。
UnicodeFontは,TrueTypeFontみたく追加できるのが256なんて制限はなく,範囲指定が可能なようだ.

Unicodeは,アスキーのような256に収まらないため,UCS4などは4バイト(21億種類)使う.CではChar型は1バイトなので,マルチバイトを扱う際はCharを複数個用意するが,JavaはCharacter型は2バイト保持できる.したがって,UTF-8は入るらしい。(しかしUTF-8は,3バイトではなかったっけ?判別文字が先頭についたはずだが、、、要は判別文字を覗いた2バイトを保持していると勝手に解釈しておこう。笑)

UnicodeFontは,addGlyphsというメソッドで,文字コードを範囲指定すれば,その分の文字をとってきてくれる.以下は,ひらがなすべてをとってくるコード.("ん"が最後だとすれば、、、小文字とか含めるとコード的に最後は"ん”じゃないかもw)

UnicodeFont ufont = new UnicodeFont("~/Library/Fonts/migmix-1m-regular.ttf", 20, false, false);
ufont.addAsciiGlyphs();
ufont.addGlyphs(Character.codePointAt("あ",0), Character.codePointAt("ん", 0));

AsciiGlyphsは,ascii文字のロード.addGlyphsで範囲指定.addNeheGlyphsというのもあったが、こちらはよくわからないのでとりあえず外した。
みておわかりのとおり、UnicodeFontにdynamicにaddできる仕様だ。必要な文字セットを追加していける。addJapaneseJIS1なんてメソッドをつくって,JIS第一標準漢字をいれればよいのだろう。


以下の範囲指定で日本語がだいたい全部(ひらがな、カタカナ、漢字)使えるようになるはずだが,これを実行したら,3秒くらい起動に時間がかかった。笑
やはりaddGlyphで1文字ずつ加えていった方がいいのか、、、?

ufont.addGlyphs("あ".codePointAt(0), "ン".codePointAt(0));
ufont.addGlyphs("亜".codePointAt(0), "腕".codePointAt(0));

【注意】
"亜"から"腕"までの差分は12985だったので、12985個の漢字をロードしてるわけだ。JIS第一+第二水準漢字でだいたい7000文字と聞いた気がするが、、、と思って,確認してみると,区分というもので区切られている。これは、必要に応じてあとから漢字を追加するためだろう。したがって、実際に使う場合は各区分をそれぞれロードしていく必要がありそうだ。(もしくはDynamic load)

JISをみてもしゃあなかったので、以下のを参考にするのが良いみたい。
(Kangxi, Hiragana, Katakana, CKJあたりが日本語っぽい。 Privateuseのも忘れずに。笑)
http://www.ssec.wisc.edu/~tomw/java/unicode.html

ちなみに、CKJはChiniese, Korean, Japaneseの略。

追記
 あれ、、、「亜」とか「亞」がはいってない。。。上のサイトでは漢字リストが不完全みたいだ。もうめんどくさいからなければdynamic load という方式にしよう。一応書き上げたのは、以下。

private void loadCharacterSets () {
	ufont.addGlyphs(0x2e80, 0x2fdf); // CKJ radicals supplement + Kangxi
	ufont.addGlyphs(0x3040, 0x30ff); // Hiragana + katakana
	ufont.addGlyphs(0x3300, 0x33ff); // CJK Unified Ideographs Extension A
	ufont.addGlyphs(0xf900, 0xfaff); //CJK compatibility Ideographs;
}