vimperatorのlookupDictionary.jsがgoo辞書で文字化けしていたので修正

追記:パッチ1カ所ミスってました。パッチを当てた後の163行目は不要です。
URLエンコードアリの場合の↓の処理です。

url = dictionary.url.replace(/%s/g,encodeURIComponent(arg));

下のパッチの方も修正しておきました。


lookupdictionary.js のバグフィックス - hogehoge

さっき気づいたんですが、lookupDictionary.jsの:gooが文字化けしまくっています。
バグフィックスはされているとのことですが、相変わらず文字化けするのは私の環境がVimperator2.0preだからでしょうか。

ひとまず自分で出来ることはしようと思い、色々調べてみました。

その結果、goo辞書が返す文字コードが問答無用でEUC-jpになっていることが原因のようです。
lookupDictionary.jsの方にエンコード処理が入っていたので、EUC-jpを明示的に指定するようにしてみました。

それと文字化けではありませんが、日本語が含まれる検索をする場合(国語辞書など)のエンコードがUTF-8でないとダメなようです。
なんでやねん!という感じですが、EUC-jpでエンコードして辞書を引くと該当無しになってしまうので、そういうものだと思うしかありません。
lookupDictionary.jsの中では先のエンコードと同じものを使うようになっていたので、返ってくるHTMLの文字コードとURLの文字コードをそれぞれ指定できるようにしました。

TEXT:
  1. --- lookupDictionary.js Sat Oct 25 04:17:41 2008
  2. +++ lookupDictionary2.js    Fri Nov 14 15:54:30 2008
  3. @@ -21,7 +21,9 @@
  4.      shortHelp: 'goo 辞書',
  5.      xpath: 'id("incontents")/*[@class="ch04" or @class="fs14" or contains(@class,"diclst")]',
  6.      multi: true,
  7. -    dictionary: 'en-US'
  8. +    dictionary: 'en-US',
  9. +    srcEncode: 'EUC-jp',
  10. +    urlEncode: 'UTF-8'
  11.  },{
  12.      names: ['answers'],
  13.      url: 'http://www.answers.com/%s',
  14. @@ -154,10 +156,11 @@
  15.              if (special && sel) arg = sel;
  16.              if (!arg) return;
  17.              var url;
  18. -            if (dictionary.encode) {
  19. +            if (dictionary.urlEncode) {
  20.                  let ttbu = Components.classes['@mozilla.org/intl/texttosuburi;1']
  21.                                       .getService( Components.interfaces.nsITextToSubURI);
  22. -                url = dictionary.url.replace(/%s/g, ttbu.ConvertAndEscape(dictionary.encode, arg));
  23. +                url = dictionary.url.replace(/%s/g, ttbu.ConvertAndEscape(dictionary.urlEncode, arg));
  24.              } else {
  25.                  url = dictionary.url.replace(/%s/g,encodeURIComponent(arg));
  26.              }
  27. @@ -171,7 +174,7 @@
  28.                  }
  29.                  var xs = new XMLSerializer();
  30.                  liberator.echo(new XMLList('<div style="white-space:normal;"><base href="' + util.escapeHTML(url) + '"/>' + xs.serializeToString( result ).replace(/<[^>]+>/g,function (all) all.toLowerCase() ) + '</div>'), true);
  31. -            }, dictionary.encode ? dictionary.encode : null);
  32. +            }, dictionary.srcEncode ? dictionary.srcEncode : null);
  33.          },
  34.          {
  35.              completer: function (arg) {


関連記事