チェック・トラブル対処Read this article in English

文字が四角い箱になる — それは文字コードではなくフォントの問題

読めるはずの文字の代わりに、空の長方形や「?」入りのひし形が並んでいる。反射的に文字コードを疑いがちですが、周囲のテキストは正常に表示されていて、一部の文字だけが欠けているなら、データはほぼ確実に正しく、原因はフォントです。フォントは自分が持っている文字しか描けません。その範囲外の文字は、通称「豆腐」と呼ばれる代替グリフに置き換わります。

フォントの問題と文字コードの問題を素早く見分ける

この2つの不具合は見た目が似ていますが、性質はまったく逆で、見分けるには1つの確認で十分です。壊れて見えるテキストをコピーして別の場所に貼り付けるか、画面上の見た目ではなく元の文字列の値そのものを確認します。

  • 貼り付けた/確認した文字列が正しい文字(例えば正しい漢字)なのに、画面では箱になっている場合 — フォントの問題です。データは正しく、単に描けないだけです。
  • 貼り付けた/確認した文字列そのものが間違っている場合(脈絡のない文字や、U+FFFD REPLACEMENT CHARACTERになっている場合) — 文字コードの問題、いわゆる文字化けです。描画に届く前にデータが壊れています。
  • 見分けの目安として、豆腐は多くの場合サイズと形が均一(固定サイズの長方形や、内部にコードポイントが印字された点線の箱など)であるのに対し、文字化けは読めそうで読めない、バラバラな文字が並びます。

グリフカバレッジ — フォントが描ける文字と描けない文字

フォントファイルの中身は、突き詰めれば「文字」から「描画命令」への対応表と、実際の描画データの組み合わせです。Unicodeが定義する全文字を網羅するフォントは存在しません。全スクリプトの全グリフを作って収録すると、ファイルが巨大になる上、どのプロジェクトでもほとんどが使われないまま終わるからです。フォント制作者は対象とする言語に基づいてカバー範囲を選び、その範囲外の文字には描画データがありません。

つまり、あるフォントは対象言語に対しては完全に正しいまま、別の言語には完全に対応できないということが起こります。ラテン文字系の欧州言語向けに作られたフォントは、CJK(漢字)のカバー範囲がゼロであることが普通ですし、日本語向けのフォントであっても、UIで使う特定の希少漢字や絵文字、記号は含まれていないことがあります。

フォントフォールバックチェーンと、それが効かないケース

多くの描画システムは1つのフォントだけに頼りません。主フォントにグリフがない場合、フォールバックチェーン(優先順位付けされた代替フォントの一覧)をたどり、そのグリフを持つ最初のフォントを使います。日頃ソフトウェアが豆腐にならずに済んでいるのは、このおかげです。システムが裏側で、主フォントが描けない文字だけ別のインストール済みフォントに黙って差し替えています。

このセーフティネットは、ゲームでは特に2つの状況で機能しなくなります。1つ目は、多くのゲームエンジンがOS自体のテキストレイヤーではなく独自のテキスト描画システムを使っており、その独自システムはフォントを1つだけ使い、フォールバックチェーンをまったく設定していないことが多いという点です。ここでグリフが欠けていても、フォールバック先が存在しません。2つ目は、フォールバックチェーンが設定されていても、実際にそのデバイス上にある、あるいはゲームに同梱されているフォントにしかフォールバックできないという点です。開発者のデスクトップ環境向けに組んだフォールバックチェーンが、プレイヤーのデバイス上ではフォールバック先を持たないことがあります。

// 例: フォント1つのみでフォールバック未設定の独自UIテキストレンダラー
const label = "コンティニュー"; // 問題なし — このフォントは日本語のかなをカバーしている
const label2 = "繼續"; // 繁体字中国語 — このグリフはフォントの
                        // カバー範囲外 → 文字列自体は正しいのに
                        // 豆腐として表示される

CJKフォントが大きい理由と、プロジェクトへの影響

中国語・日本語・韓国語のテキストは、小さなアルファベットではなく数千種類の異なる表意文字を使うため、それらを十分にカバーするフォントは数千個の個別に描かれたグリフを収録する必要があります。そのためCJK対応フォントはラテン文字専用フォントよりかなりサイズが大きくなり、同梱するフォントを選ぶチームにとって現実的で意図的なコストのトレードオフになります。日本語や中国語対応を追加するプロジェクトは、翻訳費用だけでなくフォントサイズの予算も見込む必要があり、既存ビルドに入っていたフォントをそのまま使い回せるとは限りません。

一部の文字だけが箱になっている場合の確認事項

テキストの大半は正常で、一部の特定の文字だけが箱になっている「部分的な豆腐」が、現場で最もよくあるケースで、確認すべき項目が決まっています。

  • まず元の文字列自体が正しいことを確認する(前述のコピー/確認チェック)。実際には文字化けなのにフォントを疑って時間を使わないこと。
  • 欠けている文字が、よくある文字ではなく希少な漢字・記号・絵文字でないか確認する。フォントのカバー範囲はよくある文字集合を含みつつ、ロングテールを切り捨てていることが多い。
  • 欠けている文字が特定の出所に集中していないか確認する(人名、地名、1つの文字列だけで使われる記号など)。カバレッジの穴は、フォント制作者の対象言語リストになかった種類のテキストにちょうど重なることが多い。
  • フォールバックチェーンが設定されている場合、フォールバック先のフォントがUIを作ったマシンに入っているだけでなく、実際にビルドに同梱されているか、テスト端末にインストールされているかを確認する。

関連記事