32blogby StudioMitsu
renpy10 min read

Ren'Pyで日本語ファイル名は使えるのか

Ren'Py 8.5で日本語ファイル名が動く理由と、配布時に壊れるリスクを解説。Python 3のUnicode処理の基礎知識と、安全なASCIIエイリアスパターンを紹介。

renpyvisual-novelgame-devpython
目次

Ren'Pyでゲームを作っていると、こんなことに気づくかもしれない。

renpy
play music "戦闘BGM.ogg"

日本語ファイル名が、普通に通る。エラーも出ない。

「じゃあ日本語ファイル名で管理すれば楽じゃないか」と思うかもしれないが、結論から言うとやめたほうがいい。この記事では、なぜ動くのか、なぜ危ないのか、そして安全な代替手段を解説する。

結論:動くが非公式

Ren'Py 8.5.2 では、画像・音声・動画のファイル名に日本語(非ASCII文字)を使っても、多くの環境で動作する

ただし、これは Ren'Py が公式にサポートしている機能ではない。Ren'Py の作者である Tom Rothamel(PyTom)は、Lemma Soft Forums で一貫して次のように述べている。

ファイル名には ASCII 文字だけを使うべきだ。それが配布とクロスプラットフォーム互換性を大幅に楽にする。

公式ドキュメントにも、Unicode ファイル名が正式にサポートされているという記述はない。

なぜ動くのか:Python 3のUnicode処理

日本語ファイル名が通る理由を理解するには、Python の歴史を少し知る必要がある。

Python 2 時代(Ren'Py 6.x / 7.x)

Python 2 では、文字列はデフォルトでバイト列(str = bytes)だった。日本語を扱うには u"" プレフィックスで明示的に Unicode 文字列を作る必要があった。

python
# Python 2 — これはバイト列
"戦闘BGM.ogg"

# Python 2 — これがUnicode文字列
u"戦闘BGM.ogg"

Ren'Py 6.x では、音声ファイルの内部処理が C 関数に char* 型で渡されていたため、Unicode ファイル名は UnicodeEncodeError でクラッシュしていた。この問題は 2014年に修正 されたが、根本的に Python 2 の文字列処理には限界があった。

Python 3 時代(Ren'Py 8.x)

Python 3 では、文字列がデフォルトで Unicode になった。

python
# Python 3 — これがもうUnicode
"戦闘BGM.ogg"

u"" プレフィックスは不要になり、すべての文字列リテラルがネイティブ Unicode として扱われる。Ren'Py 8.x は Python 3.12 ベースで動作するため、ファイル名の文字列処理で Python 2 時代のエンコーディング問題が発生しなくなった。

つまり、Ren'Py が日本語ファイル名をサポートしたわけではなく、Python 3 が Unicode をネイティブに扱うようになった結果、自然に通るようになった ということだ。

なぜ危ないのか:配布で壊れる3つのケース

開発マシンで動くのと、プレイヤーの環境で動くのは別の話だ。日本語ファイル名は、配布プロセスで3つの地雷を踏む可能性がある。

ケース1: macOS の Unicode 正規化問題

macOS の旧ファイルシステム HFS+ は、ファイル名を NFD(分解形) で保存する。一方、Windows や Linux は通常 NFC(合成形) を使う。

例えば「が」という文字は、内部的に2つの表現がある。

形式表現説明
NFC(1文字)合成形。Windows/Linux の標準
NFD + (2文字)分解形。macOS HFS+ の標準

ZIPファイルにNFCで格納された 戦闘BGM.ogg を macOS で展開すると、ファイルシステム上はNFDの 戦闘BGM.ogg になる。Ren'Py がNFCで検索すると、ファイルが見つからない。

実際に、商用 Ren'Py ゲーム「WORLD END ECONOMiCA」で日本語ファイル名 飛び_右下.png が macOS で読めないという問題が 報告されている

ケース2: ZIP ファイル名の文字化け

Ren'Py のビルドは ZIP や tar.bz2 で配布ファイルを生成する。ZIP 形式には ファイル名のエンコーディング標準がない

Python 3 の zipfile モジュールは UTF-8 フラグ(ビット11)を設定して格納するが、古い解凍ツールや Windows エクスプローラーの一部バージョンはこのフラグを無視する。結果として、日本語ファイル名が文字化けしてゲームが起動しない。

ケース3: Web / Android ビルドの未検証

Ren'Py は Web ブラウザ向けビルド(Emscripten / WebAssembly)と Android APK ビルドをサポートしている。しかし、これらのプラットフォームで日本語ファイル名が正しく動作するという公式の確認はない。Web ビルドでは HTTP の URL エンコーディングとの相互作用も懸念される。

安全な代替:ASCIIファイル名 + エイリアス

ファイル名は ASCII で統一し、スクリプト上の可読性は define エイリアスで確保するのが最も安全だ。

音声ファイル

renpy
# audio/ ディレクトリのファイル名は ASCII
# audio/battle_bgm.ogg
# audio/village_theme.ogg
# audio/rain_ambient.ogg

define audio.battle_bgm = "audio/battle_bgm.ogg"
define audio.village_theme = "audio/village_theme.ogg"
define audio.rain_ambient = "audio/rain_ambient.ogg"

label start:
    play music battle_bgm
    play sound rain_ambient

defineaudio 名前空間にエイリアスを作ると、play music 文でファイルパスを書く必要がなくなる。変数名を見れば何の音声かわかるので、可読性も問題ない。

画像ファイル

Ren'Py の画像自動検出は、ファイル名のスペース区切りを画像名にマッピングする(画像表示の公式ドキュメント)。

text
images/
├── bg forest.png      → scene bg forest
├── bg castle.png      → scene bg castle
├── eileen happy.png   → show eileen happy
└── eileen sad.png     → show eileen sad

手動で定義する場合も ASCII で統一する。

renpy
image bg forest = "images/bg_forest.png"
image bg castle = "images/bg_castle.png"

命名規約

プロジェクト全体で以下のルールを決めておくと、ファイルが増えても管理しやすい。

text
# 音声
audio/{種類}_{説明}.ogg
  audio/bgm_battle.ogg
  audio/sfx_sword_slash.ogg
  audio/amb_rain.ogg

# 背景
images/bg {場所}.png
  images/bg forest.png
  images/bg castle.png

# キャラクター
images/{名前} {表情}.png
  images/eileen happy.png
  images/eileen angry.png

まとめ

  • 動くか? — Ren'Py 8.5.2 では日本語ファイル名は動作する
  • なぜ? — Python 3 のネイティブ Unicode 処理のおかげ。Ren'Py の公式機能ではない
  • リスク — macOS NFD正規化、ZIPの文字化け、Web/Android未検証。配布後に壊れる可能性がある
  • 推奨 — ASCII ファイル名 + define エイリアスが安全で実用的

Ren'Py の基本については 入門ガイド を、ステータス管理の設計パターンについては ステータス管理ガイド を参照してほしい。

公式リソース: