VSCodeの文字コード自動判定を改善する
動機: "files.autoGuessEncoding"を有効化するとwindows-1252など望まないエンコードになるのを改善したい。
2019.11月現在、文字エンコードを指定するAPIは提供されていません。そのため強引な方法になります。
方法は2つあります。どちらもすることは同じです。
この記事では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
を探し任意のエディタで編集します。ファイルを開くには、関連付けがされていればダブルクリック、なけれメニューからツール→オプション→外部ツールを設定してください。エディタにドラッグして開くのは不可です。
今回は77行目に次のコードを挿入しました。
u.close(); // mod if (u.result.encoding === 'windows-1252') { u.result.encoding = 'UTF-8'; } return u.result;
他の方の編集例はこちら。 vscode の ShiftJIS 自動判定を矯正するためにソースからビルドする
編集を終えたらエディタを終了させます(タブを閉じるのではなくエディタ自体のプロセスを終了させます)。すると、7-Zipにアーカイブを更新するかのダイアログが表示されるのでOKを選びます。
ASARを使う方法
一度全て展開してから再度アーカイブします。既存の.asarにファイルを追加する方法はありません。
$ npm install -g asar
- node_modules.asarのバックアップを作る
- 展開
$ asar extract node_modules.asar node_modules_asar_extracted
- node_modules_asar_extracted 以下の
jschardet/src/init.js
を編集 - 圧縮
$ asar pack node_modules_asar_extracted node_modules.asar
動作確認
VSCodeとnpmの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}
期待通りになりました。