7cc@はてなブログ

JavaScriptとかとか

VSCodeの文字コード自動判定を改善する

動機: "files.autoGuessEncoding"を有効化するとwindows-1252など望まないエンコードになるのを改善したい。

2019.11月現在、文字エンコードを指定するAPIは提供されていません。そのため強引な方法になります。

方法は2つあります。どちらもすることは同じです。

  1. ソースファイルを直接書き換える
  2. chromiumのリモートデバッガーを使って読み込まれているスクリプトを書き換える

この記事では1番目の方法についてのみ説明します。2番目は気が向いたらいつか書きたいです。

ソースファイルを直接書き換える方法

VSCode文字コード判定に jschardet を使用しています。このモジュールはelectron独自のasarというアーカイブファイルに格納されているので、これを展開して編集します。

.asarを開く準備

Windowsであれば7-Zipプラグインをインストールするだけです。 http://www.tc4shell.com/en/7zip/asar/

他のOSではコマンドラインからASARを使います https://github.com/electron/asar

用意ができたら、VSCodeがインストールされた場所からnode_modules.asarを見つけてください。

Windowsでは以下が標準のパスです。
"%LOCALAPPDATA%\Programs\Microsoft VS Code\resources\app\node_modules.asar"

7-Zipを使う方法

7-Zip File Manager」を開きnode_modules.asarに移動、 jschardet/src/init.js を探し任意のエディタで編集します。ファイルを開くには、関連付けがされていればダブルクリック、なけれメニューからツール→オプション→外部ツールを設定してください。エディタにドラッグして開くのは不可です。

7zipでasarを開く
7zipでasarを開く

今回は77行目に次のコードを挿入しました。

    u.close();
    // mod
    if (u.result.encoding === 'windows-1252') {
      u.result.encoding = 'UTF-8';
    }
    return u.result;

他の方の編集例はこちら。 vscode の ShiftJIS 自動判定を矯正するためにソースからビルドする

編集を終えたらエディタを終了させます(タブを閉じるのではなくエディタ自体のプロセスを終了させます)。すると、7-Zipアーカイブを更新するかのダイアログが表示されるのでOKを選びます。

7zipで編集したファイルを上書き保存
7zipで編集したファイルを上書き保存

ASARを使う方法

一度全て展開してから再度アーカイブします。既存の.asarにファイルを追加する方法はありません。

  1. $ npm install -g asar
  2. node_modules.asarのバックアップを作る
  3. 展開 $ asar extract node_modules.asar node_modules_asar_extracted
  4. node_modules_asar_extracted 以下の jschardet/src/init.js を編集
  5. 圧縮 $ asar pack node_modules_asar_extracted node_modules.asar

動作確認

VSCodenpmのRunKitで結果を比較してみましょう。VSCodeではメニューバーのHelpから Toggle Developer Toolsを選択しコンソールを開きます。

require("jschardet").detect(Buffer.from("ゆ"))
// runkit {confidence: 0.95, encoding: "windows-1252"}
// VSCode {encoding: "UTF-8", confidence: 0.95}

期待通りになりました。

VSCodeで結果の確認
VSCodeで結果の確認