海外のWindowsで日本のゲームが文字化けする理由 — システムロケールの仕組みと開発者の対策
日本で作ったゲームを海外に出したら、「文字が全部化けている」「起動した瞬間に落ちる」という報告が届いた。同じビルドを日本のプレイヤーは問題なく遊んでいる。この場合、ゲームのファイルが壊れていることはまずありません。原因はプレイヤーのWindows側の「システムロケール」、設定画面で「Unicode 対応ではないプログラムの言語」と呼ばれる項目です。
古い日本語のエンジンやツールの多くは、テキストをShift_JISのバイト列として持ち、Unicode非対応の古い方式でWindowsに渡します。日本語Windowsはそれを日本語の文字表で読みますが、英語や中国語のWindowsは別の表で読むため、セリフもメニューも、開こうとするファイル名も化けます。直す操作はプレイヤー側に、予防は開発側にあります。以下、仕組み、プレイヤーへの案内、開発側の対策、日本語Windowsで中国語・韓国語のゲームが化ける逆のケースの順に扱います。
仕組み: システムロケールが決めるコードページで、テキストもファイル名も化ける
Windowsは内部ではテキストをUnicodeで扱い、Unicode対応のAPIを使うプログラムは、どの国向けの設定でも日本語を正しく扱えます。一方、古いバイト単位のAPI(いわゆるANSI版)を使うプログラムは文字をバイト列のまま渡し、Windowsはそれを一枚の変換表、システムコードページで解釈します。その表を決めるのがシステムロケールです。日本語Windowsは932(MicrosoftによるShift_JISの拡張、CP932)、英語や西欧言語は1252、簡体字中国語は936、韓国語は949、繁体字中国語は950です。
Shift_JISのデータを古いAPIで表示するゲームは、日本語Windowsではバイト列と表が一致するので正しく出ます。別のロケールではバイト列は同じでも表が違い、「こんにちは」の10バイトは英語Windowsでは「‚±‚ñ‚É‚¿‚Í」に、中国語Windowsでは「偙傫偵偪偼」になります。ファイルは1バイトも変わっていません。
ゲームが持っているバイト列(Shift_JIS) 82 B1 82 F1 82 C9 82 BF 82 CD 日本語Windows(932)で読むと こんにちは 英語Windows(1252)で読むと ‚±‚ñ‚É‚¿‚Í 中国語Windows(936)で読むと 偙傫偵偪偼 韓国語Windows(949)で読むと 궞귪궸궭궼 UTF-8ベータ設定がオンだと 置換文字と断片の混ざった列
起動時に落ちる報告も同じ仕組みです。日本語名のファイルやフォルダを開こうとすると、名前も同じ間違った表で解釈され、存在しないパスを探して「ファイルが見つかりません」で止まります。配布用のzipにUnicodeのファイル名情報がなければ、展開した時点でファイル名が化けていることもあります。
海外プレイヤーに案内する直し方: システムロケールを日本語にして再起動
プレイヤー側の操作は、システムロケールを「日本語 (日本)」にして再起動することです。Windows 11では通常、設定の「時刻と言語」から「言語と地域」を開き、「管理用の言語の設定」を選ぶと出るダイアログに「システム ロケールの変更」があります。Windows 10ではページ名が「言語」で、同じダイアログはコントロールパネルの「地域」や intl.cpl でも開けます。項目名はバージョンで変わるため、案内文には「画面が違えばMicrosoftの公式ヘルプで change system locale を検索」の一文を必ず添えてください。英語ラベルは後述のテンプレートにあります。
- 「システム ロケールの変更」を開く。変更には管理者権限が必要
- 現在のシステムロケールを「日本語 (日本)」にする
- 「ベータ: ワールドワイド言語サポートで Unicode UTF-8 を使用」のチェックが外れていることを確認する
- OKを押してWindowsを再起動する。再起動するまで反映されない
- ゲームを起動する。文字が空の四角になるなら、ロケールではなくフォントの問題(後述)
UTF-8のチェックボックスは案内から抜けやすく、単独で原因になります。オンだと、選んだロケールに関係なく、非Unicodeプログラムに渡されるコードページがUTF-8になります。Shift_JISのバイト列はUTF-8としてはほぼ不正な並びなので、置換文字や「?」だらけになるか、起動直後に落ちます。海外プレイヤーが別のソフトのためにオンにしていることは珍しくありません。
この設定は表示言語、キーボード、日付や通貨の書式を変えません。変わるのは、そのPC上のすべての非Unicodeプログラムが受け取る文字表です。そのため他の古いプログラムが今度は化けることがあります。案内には「普通のソフトには影響しない」「同じ手順で戻せる」の2点を添えると、プレイヤーが安心して試せます。
システム全体を変えずに、そのゲームだけ日本語ロケールで動かす方法
1本のゲームのためにPC全体の設定を変えたくないプレイヤーには、そのプログラムだけを日本語ロケールで起動する方法があります。Windowsではオープンソースの Locale Emulator が最もよく知られています。案内するときは、必ず公式のプロジェクトページから入手するよう添えてください。この種の小さなツールは偽物にマルウェアを仕込まれやすく、使い方もそのプロジェクトの説明が最新です。
Steam DeckやLinux上でProtonを通して動かす環境では、Steamのゲームのプロパティの起動オプションで、そのゲームだけロケールを指定する方法が広く使われています。保証された機能ではなくコミュニティで定着した方法ですが、最初に試す価値があります。
LANG=ja_JP.UTF-8 %command%
フォントに字形がない文字、本当に壊れたファイル、日本語Windowsでも壊れているゲームは、これらでは直りません。
開発側の対策: プレイヤーのロケールに依存しないゲームにする
システムロケールを変えないと遊べないゲームは、変える前に返金するプレイヤーを一定数生みます。プレイヤーにはゲームのバグにしか見えません。依存が入り込む場所は決まっています。
- テキスト・スクリプト・データをShift_JISで持ち、非Unicode(バイト単位)のAPIで読んでいる
- 配布物の中に日本語のファイル名・フォルダ名がある(zipの中も含む)
- セーブ先のパスや設定ファイルの読み込みで、マシンのコードページが日本語だと決め打ちしている
- パスにプレイヤーのユーザー名が含まれる。キリル文字や中国語のアカウント名はバイト単位のコードで表現できず、ロケールが正しくてもセーブに失敗する
- 日本語Windowsにたまたま入っている日本語フォントに頼っている
対策はそれぞれの裏返しです。
- エンジンとプラットフォームのUnicode対応のAPIを使い、テキストはUTF-8で持つ。Unicodeビルドや設定があればリリースビルドで使う
- 配布物のファイル名・フォルダ名はすべてASCIIにする。圧縮ツールがUnicodeのファイル名情報を書き出す設定かも確認する
- 必要なフォントは同梱し、ライセンスが同梱を許しているか確認する
- システムロケールが日本語ではないWindowsでテストする。マシン全体の設定なので、別のユーザーアカウントを作っても検証にならず、仮想マシンか予備のPCが要る。別アカウントは、非ASCIIのユーザー名でセーブが通るかの検証には役立つ
- どうしても日本語ロケールが必要なら、ストアページとREADMEに手順つきで明記する。買う前に知らされていれば、それを理由に低評価が付くことは少ない
報告が来たら、謝罪より5分で試せる手順を返すほうがプレイヤーのためになります。英語で返す例です。項目名はバージョンで異なるため、「公式ヘルプで検索」の一文は残してください。
Subject: Garbled text / crash on start - how to fix it on Windows Thanks for the report. The game itself is not damaged. It uses an older text system that expects the Windows "system locale" (the language for non-Unicode programs) to be Japanese. On a PC set to another locale, its text and file names are read with the wrong character table, which causes the garbled text or the crash you saw. To fix it on Windows: 1. Open Settings > Time & Language > Language & region > Administrative language settings. (The exact path differs by Windows version. If you cannot find it, search Microsoft's help for "change system locale".) 2. Click "Change system locale..." and choose "Japanese (Japan)". 3. Make sure "Beta: Use Unicode UTF-8 for worldwide language support" is UNCHECKED. 4. Restart Windows and launch the game again. This does not change your Windows display language. It can affect other old non-Unicode programs, so you can switch it back the same way later. If you prefer not to change the whole system, a per-application locale tool also works for many players. On Steam Deck or Linux with Proton, try this launch option in the game's properties: LANG=ja_JP.UTF-8 %command%
症状から切り分ける: ロケールか、フォントか、データの損失か
似た症状が複数あり、化け方で見分けます。決め手は、同じビルドが日本語Windowsでは正常で、報告者のロケールが日本語以外かどうかです。
- セリフ、メニュー、エラーダイアログ、ゲームフォルダ内のファイル名まで日本語が全部化けていて、化けた先が空白ではなく読める記号や漢字になっている。これはシステムロケール
- 空の四角や枠だけの箱になるが、テキストをコピーすると正しい日本語が取れる。字形を持たないフォントの問題で、「文字が四角い箱になる — それは文字コードではなくフォントの問題」で扱っています
- 一部の文字列だけがただの「?」で、日本語Windowsでも同じ。開発側で文字が捨てられており、プレイヤー側では戻せません。「文字化けが本当に戻らない2つのケース」で扱っています
- 起動直後に、読めない文字を含むパスやファイル名を挙げてクラッシュする。ファイル名がテキストと同じ間違った表を通るので、非常に多くの場合ロケール
逆のケース: 日本語Windowsで中国語・韓国語のゲームが文字化けする
ここまでの話は方向を問いません。コードページ936でテキストを持つ中国語のゲームや、949で持つ韓国語のゲームは、日本語Windowsでは同じ理由で化けます。日本のプレイヤーには、半角カタカナと脈絡のない漢字が混ざった列や、読めないパスを挙げたクラッシュに見えます。直し方はシステムロケールを「中国語 (簡体字、中国)」「韓国語 (韓国)」のような、そのゲームが要求する項目に変え、同じくUTF-8のチェックを外して再起動することです。表示言語は日本語のまま変わりません。
ロケールが中国語の間は、手元の古い日本語の非Unicodeプログラムが今度は化けるので、遊び終わったら同じ手順で戻してください。開発側の教訓も同じです。プレイヤーのシステムロケールは前提にしてよいものではありません。Unicodeで作り、ファイル名はASCIIにし、フォントを同梱し、自分と違う設定のマシンで試す。それだけで、この記事の前半が不要になります。