これのことです。正確にはSJIS対応パッチですね。パッチとか言っておいて実は単に変更を施したソースファイルをzipで固めてあるだけです。アーカイブを解凍してその中身をluaのsrcフォルダにコピーして上書きしてください。
その後luaを再ビルドするわけですが、その際_MBCSをdefineしてください。パッチのlzio.hを見ればわかりますが、このマクロがdefineされてないと、実質オリジナルといっしょの状態になります。逆に「このパッチの影響でバグってるんでは」とか思ったら_MBCSを宣言しなければ良いわけです。
また自分のアプリに組み込んでこのSJIS対応っぷりを享受するには、アプリ内でluaを使う前に
setlocal(LC_ALL, "");
をやっておく必要があります。配布アーカイブ中のlua/lua.cの、main関数の最初のほうでやってますね。SJISの判定にisleadbyte使ってるんで、これが必要なんです。
5.0.2についてきたソースを変更して製作しましたので、5.0.2に対して上書きして使用してください。SJIS対応のために変更したソースは5.0→5.0.2間で特に変更されてないので5.0でも大丈夫そうですけど。
luaは8bitクリーンです。単に文字列の中で日本語を使いたい、というだけなら、EUCやUTF-8を使えば何の問題もありません。
でもSJISは文字の2バイト目が\といっしょっていう文字が含まれる欠陥文字コードなので、
io.write("ソ")
とかやると「文字列リテラルが終わってない!」とか言われてしまいます。後ろの'"'がエスケープされてしまうんですね。
Windows環境では標準出力の文字コードはSJISを前提にしているんで、EUCやUTF-8でスクリプトかいてやってもio.writeなどで文字列を表示させようとすると文字化けするんで、SJISを使わざるを得ないでしょう。というわけで今回のこのパッチです。
またsetlocaleでコードページを日本語にしておくと、全角のアルファベット・漢字・カタカナ・ひらがな・数字もisalnumでtrueになります。で、luaの字句解析ではシンボルの判定にisalpha・isalnumを使っています。そんなわけで
function 表示(...)
io.write(string.format(unpack(arg)))
end
メッセージ = "日本語関数変数OK"
表示(メッセージ)
ってな表記がluaスクリプト内で可能になります。
便利かどうかいまいち不明ですが。
日本語の関数名・変数名を使いたい、というのであれば、EUCやUTF-8でもOKという環境の方でも、導入する価値はあるかと思います。
2004年6月4日以前に、ここのパッチを持っていった方、すみません、それバグってます。
読み取りバッファの折り返し地点に多バイト文字がまたがると正常に読み取られない、というありがちなバグです。一切日本語を使ってないならOKですが、コメントで日本語使っただけでも運が悪いとこれに遭遇します。
お父さんはすでに仕事に実戦投入していたんですが、これに遭遇して結局オリジナルバージョンに戻しやがりました。ずいぶん前に気づいていたんですが、知ってるなら知ってるでさっさと告知しろっつーかほんとにごめんなさい。現在のバージョンではこうした不具合は解消されています。
久しぶりに更新。
MSVC以外のいくつかの環境で、ちゃんと動作しない可能性があった点と、コンパイル済みのバイナリLuaファイルで誤動作する点を修正しました。codedump様、アカホ様、ご指摘ありがとうございます。
© 2002-2005 SowwaRay