質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.45%

  • C#

    9265questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity3D

    1864questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • Windows

    1736questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Windows 7

    415questions

    Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

  • Lua

    59questions

    Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。

Luaでファイル名にShift-JISの日本語を含むファイルを読み込むには?

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,323

port_san

score 6

現在、Unity3Dでストーリー性があるゲームを作成しており、イベント管理をするためにNLua(Luaのバージョンは5.2)を使っています。
ゲームは、日本語を含むパスに置かれる場合も考えられ、また、Luaファイルにも日本語を使いたいと考えています。

しかし、luaファイルのパスに日本語を含む、または、ファイル名に日本語を含むファイル(以下、日本語ファイル)を
DoFileメソッドで読み込むことができませんでした。

以下、windows7で日本語ファイルの読み込みを検証したコードです。
ちなみにLua本体であるlua52.dllは
https://github.com/NLua/NLua
からソースコードをダウンロードしてVisual Stadio 2015でコンパイルして作成したものを使いました。

 E:\えええ.lua

Debug.Log( "hello".."aaa")

 E:\test.lua

このファイルのみShift-JISで書いてあります。

print("えええ")
print("えええ")
assert(loadfile[[E:\えええ.lua]])()
using NLua;
using NUnit.Framework;

public class LuaJapaneseTest {

    Lua lua;

    [SetUp]
    public void SetUp() {
        lua = new Lua();
        lua.LoadCLRPackage();
        lua.DoString("import 'UnityEngine'");

    }

    [Test]
    public void えええを読み込めるか() {
        string filename = @"E:\えええ.lua";
        lua.DoFile(filename);
    }

    [Test]
    public void ShitJISでファイル名を指定して読み込めるか() {
        string filename = @"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#で)にはどうすればいいでしょうか。

です。

長文になってしまいましたが、回答よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

check解決した方法

0

以下の方法で文字コードを変換してファイルにアクセすることが出来ました。

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);
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

c#はしばらく触れていないし、NLuaというのもよく知りません。

そもそも、Windowsで日本語ファイルが読み込めないのはファイル名はShift-JISで、DoFileの引数で渡される文字列の文字コードが、C言語で書かれたLua本体で正しく認識されないからなのか 

まぁおおよそそうですが一応補足を。

DoFileというのは、おそらく名前からしてluaのluaL_dofileを呼び出すラッパメソッドだと思います。
luaL_dofileは、ファイルをfopenを使用してアクセスしますが、ファイル名のエンコードは、環境に依存します。
VisualStudioであれば、MBCS(Windowsの言語による。日本語環境であれば、ShiftJIS)になります。

対して、C#の内部文字コードはUNICODEだったと思います。
だとすれば、おそらくluaにはUTF-8エンコードで渡されているのではないかと予想できます。

NLuaのページを見ると、DoStringというメソッドを使っています。
おそらく、luaL_dostringのラッパメソッドで、ファイルに書かれたスクリプトではなく、文字列をスクリプトとして実行するものかと思われますので、c#側でファイルよりスクリプトを読み込み、DoStringメソッドを呼んでスクリプトを実行するのが一番スマートかと思います。
こうすれば、ファイル名のエンコードは気にしなくて良いはずです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    9265questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity3D

    1864questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

  • Windows

    1736questions

    Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

  • Windows 7

    415questions

    Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

  • Lua

    59questions

    Luaは、汎用のスクリプト言語の一つで、 移植性が高く、高速な実行速度などの特徴を持ち 手続き型・オブジェクト指向言語としても利用可能で 関数型言語、データ駆動型の要素も併せ持っている言語です。