- 作成者投稿
- 2009年1月14日 5:40 am #6959kshi参加者
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を実行する方法はあるのでしょうか。
(文字列を解析して自前でエンコードするというのはナシで……)2009年1月15日 6:56 pm #6962Yutaka 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 はどこで使用されているのでしょうか? 具体的なサンプルを提示していただければ回答しやすいと思います。
2009年1月17日 1:29 pm #6969kshi参加者江村さん、コメントありがとうございます。
勘違いだったようです。いま手元でやってみたら再現しませんでした。
もしかすると私の環境依存(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.aspx2009年1月18日 3:26 am #6970palazzoメンバー通常の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”);こちらの方法ならば、システムに登録されているエンコーディングであれば、何でも読めるはずです。
2009年1月18日 1:11 pm #6971kshi参加者palazzo さん、コメントありがとうございます。
ADODB.StreamでWEB検索してみたら、
文字コードがらみの情報がわんさか出てきました。コードのほうですが、
strm.LoadFromFile(DataFileName);
var buff = strm.readText(-1); //全部読むで良いのですよね?
Charsetに”_autodetect”を指定したらエラー。
省略したら正常に読み込めたり。
うーん、理解が浅いようです。いろいろ試してみます。 - 作成者投稿
- このトピックに返信するにはログインしてください。