2011-01-22

Zen Coding for Notepad++(0.6.1): NppScriptingでincludeされるjsファイル内の日本語が文字化けするのを回避する

Notepad++でZen-Codingの自分用のコードが書けるようにできたのでいろいろコードを付け加えてみたんですが、日本語を入れたら一部の文字が化けてしまったので回避方法を考えました。

A. NppScriptingのstart.jsのinclude()を修正する

文字が化ける原因を調べたところ、jsファイルを読み込んでいるstart.jsのinclude()にはUTF-8でファイルを保存するようコメントがあるんですが、

  1. ファイルをASCIIで読み込む ( fso.OpenTextFile(file,1, false,0) )
  2. 読み込んだデータをUTF-8(コードページ65001)でデコードする ( var scr = Editor.decodeFrom(65001,f.ReadAll()) )
  3. ファイルの内容を実行 ( eval(scr) )

というようにファイルを読み込んでいて、UTF-8でデコードするところでデコードに微妙に失敗していました。

そのため、ファイルを読み込む方法をUTF-8で直に読み込むように修正します。つまりstart.jsの

var fso = new ActiveXObject("Scripting.FileSystemObject");
function include(file){
 if (fso.FileExists(file)){
  var f = fso.OpenTextFile(file,1, false,0);
  var scr = Editor.decodeFrom(65001,f.ReadAll());
  if (scr && scr.length>0){

を、

var fso = new ActiveXObject("Scripting.FileSystemObject");
var f = new ActiveXObject("ADODB.Stream");
f.Charset = "UTF-8";
function include(file){
 if (fso.FileExists(file)){
//  var f = fso.OpenTextFile(file,1, false,0);
//  var scr = Editor.decodeFrom(65001,f.ReadAll());
  f.Open();
  f.LoadFromFile(file);
  var scr = f.ReadText();
  if (scr && scr.length>0){

に修正します。

B. ファイル内の日本語をUnicodeエスケープする

日本語を直に使わずにUnicodeエスケープ(例: 「あいう」→「\u3042\u3044\u3046」)して保存しても文字化けがなくなります。楽にUnicodeエスケープ/アンエスケープできるように、ファイル内の日本語(というかASCII文字以外の文字)をUnicodeエスケープするスクリプトを作りました。

上記スクリプトをunicode_escape.jsなどと名前をつけて保存して、includesフォルダ(おそらく C:\Program Files\Notepad++\plugins\NppScripting\includes )に置くと下記のことができるようになります(Notepad++の標準機能でUnicodeエスケープ/アンエスケープできるか調べたんですがわからなかったので、取りあえずのものです)。

  • メニューバーに「my」という項目が追加され、Unicodeエスケープとアンエスケープの項目が置かれる
  • Ctrl+Uでファイル内のASCII文字以外の文字のUnicodeエスケープを行う
  • Ctrl+Shift+UでUnicodeエスケープのアンエスケープを行う