1 件の投稿を表示中 (合計 5 個)
  • 作成者
    投稿
  • #6959
    kshi
    参加者

    WSHのFileSystemObjectを利用して、他のスクリプトファイルの内容を読み込み、
    evalで実行するマクロを作っていたところ、スクリプトファイルのエンコードが
    システム既定?(シフトJIS)でないと「文字が正しくありません」というエラー
    が出ました。

    UTF-16LE (BOM付き) で保存したスクリプトを

    var fso = new ActiveXObject(“Scripting.FileSystemObject”);
    var ts = fso.OpenTextFile(DataFileName, 1, true, -1);

    のようにUnicode指定(-1)で読んでもエラーになります。

    手元で試した限りでは、
    「システム既定エンコードの文字列でないとevalが正常に動作しない」
    という感じです。

    システム既定以外のエンコードでもevalを実行する方法はあるのでしょうか。
    (文字列を解析して自前でエンコードするというのはナシで……)

    #6962
    Yutaka Emura
    キーマスター

    kshiさんは書きました:
    WSHのFileSystemObjectを利用して、他のスクリプトファイルの内容を読み込み、
    evalで実行するマクロを作っていたところ、スクリプトファイルのエンコードが
    システム既定?(シフトJIS)でないと「文字が正しくありません」というエラー
    が出ました。

    UTF-16LE (BOM付き) で保存したスクリプトを

    var fso = new ActiveXObject(“Scripting.FileSystemObject”);
    var ts = fso.OpenTextFile(DataFileName, 1, true, -1);

    のようにUnicode指定(-1)で読んでもエラーになります。

    手元で試した限りでは、
    「システム既定エンコードの文字列でないとevalが正常に動作しない」
    という感じです。

    システム既定以外のエンコードでもevalを実行する方法はあるのでしょうか。
    (文字列を解析して自前でエンコードするというのはナシで……)

    これは EmEditor のマクロの質問というよりは、JavaScript の質問ということになりますが、 eval はどこで使用されているのでしょうか? 具体的なサンプルを提示していただければ回答しやすいと思います。

    #6969
    kshi
    参加者

    江村さん、コメントありがとうございます。

    勘違いだったようです。いま手元でやってみたら再現しませんでした。
    もしかすると私の環境依存(XPとVista)かもしれません。

    参考までに、以下の main.jseeとsub.jseeを同じフォルダに置いて、
    main.jseeを実行すると、sub.jseeの内容を読み込んで実行します。

    ■ main.jsee

    var DataFileName = ScriptFullName.replace(ScriptName, “sub.jsee”) ;

    var TristateUseDefault = -2 //システム デフォルトを使ってファイルを開く
    var TristateTrue = -1 //ファイルを Unicode ファイルとして開く
    var TristateFalse = 0 //ファイルを ASCII ファイルとして開く

    var fso = new ActiveXObject(“Scripting.FileSystemObject”);
    if (fso.FileExists(DataFileName)) {
    var ts = fso.OpenTextFile(DataFileName, 1, true, TristateUseDefault);
    var s = ts.ReadAll();
    ts.Close();
    }
    eval(s);
    alert(“mainに戻りました”);

    ■ sub.jsee

    alert(“sub.jseeを実行中”);

    いまWindows XPで試した結果は以下の通りでした。

    ● sub.jsee をシフトJIS で保存した場合
    ・ システムデフォルトで開く → OK
    ・ Unicodeとして開く → NG
    ・ ASCIIファイルとして開く → OK

    ● sub.jsee をUTF-16LE(BOM付き)で保存した場合
    ・ システムデフォルトで開く → OK
    ・ Unicodeとして開く → OK
    ・ ASCIIファイルとして開く → NG

    こうしてみると、「システムデフォルトで開く」にすれば無難そうです。
    OpenTextFileの4番目のパラメータを省略すると、TrestateFalse(0)が既定とな
    るようですので、TristateUseDefault(-2)を明示することにします。

    【参考URL】 なぜか OpenTextFileのほうには具体的な数値がない……。
    http://msdn.microsoft.com/ja-jp/library/cc428042.aspx

    #6970
    palazzo
    メンバー

    通常のUnicodeではなくUTF-16ならば、こちらの方が妥当なのでは?

    // インスタンスの生成
    var strm = new ActiveXObject(“ADODB.Stream”);

    // 出力ストリームの設定
    //strm.Type = adTypeText;
    strm.Type = 2;

    // 変換したい文字コードを指定する
    strm.Charset = “utf-16”;

    // ストリームを開く
    strm.Open();

    // 指定したストリームでテキストをロード
    var buff = strm.LoadFromFile(“sub.jsee”);

    こちらの方法ならば、システムに登録されているエンコーディングであれば、何でも読めるはずです。

    #6971
    kshi
    参加者

    palazzo さん、コメントありがとうございます。

    ADODB.StreamでWEB検索してみたら、
    文字コードがらみの情報がわんさか出てきました。

    コードのほうですが、

    strm.LoadFromFile(DataFileName);
    var buff = strm.readText(-1); //全部読む

    で良いのですよね?

    Charsetに”_autodetect”を指定したらエラー。
    省略したら正常に読み込めたり。
    うーん、理解が浅いようです。いろいろ試してみます。

1 件の投稿を表示中 (合計 5 個)
  • このトピックに返信するにはログインしてください。