スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告|
  3. トラックバック(-)|
  4. コメント(-)

うにこーど

英語版対応の時に文字コード関連でちょっと引っかかったのでメモっときます。


■ OSを英語環境に設定してチェックする
コントロールパネルの「地域と言語」で、
「システムロケール」を英語かなんかに。「場所」を米国かなんかに。

140612_00.jpg
これでマルチバイトで普通に日本語とか出してたとこは化けると思います。
ゲームの対応としてはユーザーから見える文字について対応できてれば良いので、
プログラム自体はマルチバイトのままいって、
ユーザーに見せる表示処理だけどうにかするという方向でいきます。



■ マルチバイトプログラム(SJIS)の海外対応の選択肢
1.SJISから一切の変換なくそのまま使う
2.UTF-8にする
3.UTF-16にする

まず1のSJISをそのまま使う方法。うちだとフリージアさんがこの方式です。
「一切の変換なく」の点が重要で、先の英語OS設定を行うとWindowsAPIでSJISが使えません。
具体的には WideCharToMultiByte で CP_ACP を指定しても動かない。(参考)
内部変換ができないため、SJISで受け取りSJISのまま処理するしかありません。

ビットマップフォントみたいな自前でフォントテーブルを参照する方式で使えます。
OSのシステムを使ったフォント表示だと無理です。


2と3は共にUnicode対応ということになります。
フォント表示に限って言えば3のUTF16対応が最も有効なのですが、
全ての文字を2バイトにされてしまうので色々困ったりします。
UTF8であれば半角英数は1バイトのままでSJISとの互換も保つので、
途中から対応する場合は基本UTF8で処理するのが個人的にはオススメ。
アスタはUTF8にしました。



■ 落とし穴いろいろ

ビットマップフォント系は文字列を1文字ずつ解釈していかないといけないので、
文字単位のバイト長の判定が必要になります。
UTF16は2バイト固定ですが、UTF8は可変長で最大6バイトまでいっちゃいます。

UTF8でバイト長取る例
u8 Font::getByteSizeUtf8( u8 uCode )
{
	u8	uRet = 1;
	if( 0x80 & uCode ){	//!< 1バイト文字以外
		for( u8 i=2 ; i<=8 ; i++ ){
			uCode <<= 1;
			if( !(0x80 & uCode) )	break;
			uRet++;
		}
	}
	return uRet;
}
ちなみに漢字は3バイト


漢字判定。
厳密にやるとかなりめんどいっぽいですが、簡易的に取るならこれで問題ありませんでした。
	uWord >= 0xE4B880 && uWord <= 0xe9bea0
参考:UTF-8コード表


表示時に UTF8 から UTF16 への変換。
日英対応くらいならおそらく必要ないんですが、
>ポルトガル語をUTF8のままシステムフォント表示に流し込んだら文字化けした。
って肉の人が言ってました。
直前にUTF16へ変換してから送ったら直ったそうな。

UTF8とUTF16の相互変換はOS設定とかに関係なく可能です。
やり方はググったらいっぱいでてきます。



もうSJISなんて使うなよって話ではありますが、やっぱり中々難しい。

というか英語OSでも内部変換さえできれば問題なかったんですけど、
それさえ出来なくしたWindows様に怒りが有頂天なのでありんす。

あと英語ならなんとなくは分かるわけですけど、
世界にはもはや記号にしか見えない文字がたくさんあるわけでして、
多言語対応は茨の道だと思いました。まる。
  1. 2014/06/12(木) 15:48:33|
  2. 自作自演|
  3. トラックバック:0|
  4. コメント:0

コメントの投稿

管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://raevatain.blog9.fc2.com/tb.php/1280-2b673bdc
Map
TweetsWind
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。