質問: @"E:\test.lua"; lua.DoFile(filename); } } ``` ### 実行結果 えええを読み込めるか [0.001s] NLua.Exceptions.LuaScriptException : cannot open E:\えええ.lua: No such file or directory at NLua.Lua.ThrowExceptionFromError (Int32 oldTop) [0x0003a] in G:\program\Assets\NLua\Lua.cs:365 at NLua.Lua.DoFile (System.String fileName) [0x00068] in G:\program\Assets\NLua\Lua.cs:530 at LuaJapaneseTest.えええを読み込めるか () [0x00006] in G:\program\Assets\Script\Editor\LuaScripts\LuaJapaneseTest.cs:19 --- となり、Shift-JISでファイル名を指定した場合のみ読み込みに成功します。 Ubuntu14.02 64bitで実行したときは、日本語ファイルを読み込むことが出来、 Windows7 64bitでは読み込むことが出来ませんでした。 以上のことから日本語ファイルを読み込めない原因は、Windowsのファイル名はShift-JISで、DoFileの引数で渡される文字列の文字コードが、C言語で書かれたLua本体で正しく認識されないことではないかと考えました。 そこで、 * C#側で文字コードをShift-JISに変換して渡す * Lua側で受け取った文字列をShift-JISに変換する * C言語で受け取った文字列をShift-JISに変換する という3つの方法が考えられます。 質問したい点は * そもそも、Windowsで日本語ファイルが読み込めないのはファイル名はShift-JISで、DoFileの引数で渡される文字列の文字コードが、C言語で書かれたLua本体で正しく認識されないからなのか * もし、そうなら、C#もしくはLua、C言語で文字コードを変換する(できればLuaかC#で)にはどうすればいいでしょうか。 です。 長文になってしまいましたが、回答よろしくお願いします。
回答: 以下の方法で文字コードを変換してファイルにアクセすることが出来ました。 ``` using NLua; using NUnit.Framework; using System.Text; using System.Linq; public class LuaJapaneseTest { [Test] public void Shif_JISに変換して読み込む() { var lua = new Lua(); lua.LoadCLRPackage(); string filename = @"E:\えええ.lua"; //NLuaで配列の要素に[]でアクセス出来ないのでリストに変換 var encodedByte = Encoding.GetEncoding(932).GetBytes(filename).ToList(); string DoFileCode = @" -- 配列のインデックスの要素を呼び出す import 'UnityEngine' -- リストをテーブルに変換します。 -- 引数にListを取ります local function arrayToTable(list) local table = {} for i = 1, list.Count, 1 do table[i] = list[i - 1] end return table end return function(byteList) local str = string.char( table.unpack( arrayToTable(byteList))) --文字コードを確認 Debug.Log(table.concat(table.pack(string.byte(str, 1, #str)), ""-"")) assert(loadfile(str))() end "; var DoFile = (LuaFunction)lua.DoString(DoFileCode)[0]; DoFile.Call(encodedByte); } } ```