2012年12月18日火曜日

文字コードの話

ゲーム日本語化 Advent Calendar 2012

ゲームの多言語の対応は大きく4つに分けられる。

  • 1. 英語のみ(ASCII)
  • 2.ドイツ・フランス語などラテン文字の言語(Latin-1,ISO-8859-1)
  • 3. ロシア・チェコ語などその他の1byte(224以内の)文字の言語(ISO-8859-X)
  • 4.中国、日本、韓国など、それ以上の文字数(マルチバイト)の言語(Chinese, Japanese, KoreanをまとめてCJKと呼ぶ) Unicode

ゲームプログラムがテキストから文字を取り出すとき、1byte系の言語なら1byteが1文字と簡単である。
しかしCJK対応するには、1byteの文字なのか、後続のデータを含めて2-3byteで1文字なのかを判定して取り出す必要がある。

また、フォント処理でも、1byte系言語なら256の表を用意して
'A' => 文字コード41h => 表の41h番目のフォント
という簡単な処理だが、CJK対応には、たくさんの文字から適切にフォントを探すようなプログラムが必要になる。


日本語化する上で、ゲームがどこまで対応した作りになっているかが重要になる。

1.英語のみ


このタイプは日本語化は難しい。英字(大文字26+小文字26)を潰して全て「かな」または「カナ」にすることはできなくはないが、英字が使えなくなるので完全に訳す必要がある。
古いゲームやindieの一部に見られる。

2. ドイツ・フランス語など


ドイツ・フランスなど西ヨーロッパの国々は共通の文字コードを使っている。
言い換えると西ヨーロッパの国々が共通して使える文字コードを決めた、と言える。

Steamで 言語: English*, ドイツ語, フランス語, イタリア語, スペイン語

などと特定国に偏っているのは、市場規模の理由もあるが、プログラム対応コストをかけずに翻訳コストだけで対応できるからでもある。

世界展開・マルチプラットフォーム展開する大手のものを除き、多くはここまでの対応である。

ドイツ語化MODが存在する場合、アーカイブ形式とメッセージ形式が解析されたことを意味する。
これに加えてフォント形式を解析すれば、かな化は可能である。
かなの他に、数文字までなら漢字を使うこともできる。古いファミコンゲームで一部だけに漢字が使われてたのと同じ。

3. ロシア・チェコ語など


ロシア語化MODが存在する場合、2.に加えてフォント形式が解析されたことを意味する。
元々ロシア産のゲームは、1byte文字で対応している場合と、unicodeで対応している場合がある。
前者はかな化、後者の場合は日本語化できる可能性がある。

4. 中国語・韓国語など


ゲームが元々マルチバイトに対応しているか、ゲームプログラムを変更して無理やり表示させているMODもある。

中文化MODが存在する場合、アーカイブ形式、メッセージ形式、フォント形式が全て解析されており、マルチバイト文字の表示が可能なことを意味する。

ただし、中文化MODは改変結果のみが配布されており、解析情報は公開していないか公開しているけれども中国語だから見つけにくいのか、
存在するだけでは「表示可能であることが実証された」という意味程度で、日本語化するには改めてフォント形式などを解析する必要がある。

Unicode

マルチバイトの文字コードには、国(言語)ごとに違うコード(Shift-JIS等)と、世界共通コード(Unicode)があるが、現在のゲームは殆どがUnicodeである。

データ上では、Unicodeを1-3byteのマルチバイトに割り当てたもの(UTF-8)と、常に2byte使うもの(UTF-16)がある。
UTF-16はさらにUTF-16LE(Little Endian)とUTF-16BE(Big Endian)のものがある。
メモ帳(notepad)で文字コード指定での保存時に「Unicode」とあるのがUTF-16LEである。

PCゲームのUTF-16は殆どの場合UTF-16LEであるが、ゲーム機からの移植等でまれにUTF-16BEの場合もある。


この中でどのような対応しているかは、テキストの文字コードで判断できる。

ASCII,Latin-1,utf-8は、英数字の部分(20-7f)は同一なので、テキストを見ても区別が付きにくいことがある。

Steam等で再インストールなしで言語を簡単に切り替えられる場合は、試しにドイツ語やフランス語に変えて、ドイツ語用のデータを追加ダウンロードしてみる。

英語しかない場合、テキストに著作権表記の©や、商標権表記の®が含まれていれば、そのコードがLatin-1かutf-8かで判断できる。


フォント画像がtgaやDDSなどの形式で簡単に確認できる場合は、フォント画像からも推測できる。
画像にラテン文字しかない場合はLatin-1である可能性が高い。
つまりかな化できる可能性が高い。

ラテン文字とそれ以外の文字が1枚の画像にある場合は、Unicodeである可能性が高い。
つまり日本語化できる可能性が高い。


Unicode対応していても一筋縄でいかない場合がある。

Unicode一覧を見ると1fffくらいまでで、CJKを除くほとんどの言語をカバーしていることがわかる。

ゲームによってはこの範囲の多言語化しか想定しておらず、CJK文字は3000くらいから始まるので、漢字やかなのメッセージを食わせるとぶっ飛ぶことがある。

このような場合、unicodeテキストの読み込み自体は実装されているので、
100-1fffあたりに漢字やかなを割り当てた「俺コード」をデッチあげて、それに沿ってフォントを作成したりテキストを変換すればよい。


unicode テキストを編集する際に気をつける点が2つある。

BOM


テキストエディタによっては、BOM(Byte Order Mark)という見えない文字がくっつくことがある。
ゲームによってはBOMが有る/無いと動かないことがあるので、元データにあわせる。

BOMは
UTF-16LEなら ff fe
UTF-8なら ef bb bf
である。

素のテキストファイルだから簡単に変更できるのでは?と思って変更したら動かなかった、と言う場合は、
目grepとかわかんね、という人も先頭数バイトくらいは確認してみよう。

外字


ゲームによっては、未使用領域や外字領域を、ボタンや矢印等のアイコンの文字コードとして使っている場合がある。
これは通常のエディタでは見えないので、編集時に注意するか、コンバータで置換するようにする。


1 件のコメント: