@enc
日本語のファイル名を Lua の標準関数に渡したら、開けなかった……。Windows の世界では、いまだに UTF-8 ではない文字コードが幅を利かせておりますの。
では、日本語の名前のファイルは諦めるほかないのでございますか。
諦めるには及びませんわ。間に立って言葉を取り持つ通訳――@enc がおりますもの。地味な子ですけれど、覚えておいて損はございませんわよ。
@enc は、UTF-8 と ANSI(システムのロケールの文字コード)の間で文字列を変換するモジュールである。主に Windows で、日本語を含むファイルパスを Lua 標準の入出力関数(io.open など)へ渡すときに使う。
local enc = require "@enc"
モジュールのメタデータ: _VERSION = "0.1.0"、_DESCRIPTION = "Encoding conversion (UTF-8 <-> ANSI)"
Pasta の文字列(DSL の台詞・変数、scripts/ の Lua ソース)はすべて UTF-8 である。一方、Windows 上の Lua 標準の入出力関数はファイルパスを ANSI のバイト列として解釈する。日本語版 Windows の ANSI は CP932(Shift_JIS)である。Lua 標準の入出力関数が長いパス・ANSI で表せないパスを扱えない点は 起動シーケンスとモジュール解決 の既知の制限で扱う。
to_ansi(utf8_str)
UTF-8 の文字列を ANSI のバイト列へ変換する。
enc.to_ansi(utf8_str) -> ansi_string, nil | nil, error_message
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
utf8_str | string | ✅ | 変換元の UTF-8 文字列 |
戻り値: 成功時は ansi_string, nil、失敗時は nil, error_message。"" は "" になる。
失敗する条件:
utf8_strが文字列でない(expected string, got integerなど)。- 入力が正しい UTF-8 でない(
invalid UTF-8 input: …)。 - ANSI で表現できない文字を含む(
ANSI conversion failed: …。日本語版 Windows で絵文字を渡した場合など)。
to_utf8(ansi_str)
ANSI のバイト列を UTF-8 の文字列へ変換する。
enc.to_utf8(ansi_str) -> utf8_string, nil | nil, error_message
| パラメータ | 型 | 必須 | 説明 |
|---|---|---|---|
ansi_str | string | ✅ | 変換元の ANSI のバイト列 |
戻り値: 成功時は utf8_string, nil、失敗時は nil, error_message。"" は "" になる。
失敗する条件:
ansi_strが文字列でない(expected string, got nilなど)。- ANSI のバイト列として正しくない(
UTF-8 conversion failed: …。メッセージの後半は OS のエラーメッセージ)。
戻り値パターン
2 つの関数は、成功時に 値, nil、失敗時に nil, エラーメッセージ の 2 値を返す。引数の型が合わない場合も Lua のエラーにはせず、この形で失敗を返す。失敗したときは、あわせて警告ログを出す。
local enc = require "@enc"
-- UTF-8 → ANSI(日本語のパスを Lua 標準の入出力関数へ渡す)
local ansi_path, err = enc.to_ansi("C:/ユーザー/設定.txt")
if ansi_path then
local file = io.open(ansi_path, "r")
if file then
local content = file:read("*a")
file:close()
end
else
print("変換エラー:", err)
end
-- ANSI → UTF-8(ANSI で返ってきた文字列を Pasta の文字列として扱う)
local utf8_path, err2 = enc.to_utf8(ansi_path)
if utf8_path then
print("ファイルパス:", utf8_path) -- C:/ユーザー/設定.txt
end
プラットフォームによる違い
- Windows: システムの ANSI コードページ(日本語版では CP932)との間で変換する。結果は OS のロケール設定に依存する。ANSI コードページが UTF-8 のシステムでは、
to_ansiは入力をそのまま返す。 - Windows 以外: 変換しない。
to_ansiは入力をそのまま返す。to_utf8は入力が正しい UTF-8 ならそのまま返し、そうでなければ失敗する。
複数のプラットフォームで動かすコードでは、変換結果の違いに注意する。
文字コードの行き違いも、これで解きほぐせますわね。日本語のパスで io.open が転んだら、まずこの子を呼びなさいまし。もっとも、永続化なら @pasta_persistence に任せるのがいちばん楽ですのよ。
通訳のお次は、書記のお出ましと伺っております。