Node.js で iconv-lite は要らない?
◆ TextDecoder が使えるけど sjis は Full ICU データが必要
◆ UTF-8 以外の日本語などを扱うなら iconv-lite のほうが使い方揃ってていいかも
◆ UTF-8 以外の日本語などを扱うなら iconv-lite のほうが使い方揃ってていいかも
ときどきある sjis ファイルを読み込みたいとき iconv-lite を使って変換しています
考えてみると Node.js でも ブラウザ JavaScript と同じく TextDecoder があります
それなら別に iconv-lite なくていいんじゃない?と思って試してみました
コマンドプロンプトの出力は sjis になってるので echo のヘルプメッセージを出すコマンドで受け取った stdout と stderr を sjis デコードして console.log します
やってみた結果は
RangeError [ERR_ENCODING_NOT_SUPPORTED]: The "shift_jis" encoding is not supported
サポートされてない……
ドキュメントを見たところ sjis には Full ICU Data が必要みたいです
一般に公開されてるバイナリファイルでは full ICU でないビルドみたいです
使われない場合が多いのに重くなるので仕方ないのかも
Node.js のビルド それも自分で設定変えてなんて面倒だなーと思ってましたが Node.js の実行時に読み込むこともできるようです
Full ICU データは npm の full-icu パッケージで取得できるみたいなのでインストールしました
使い方はこんな感じ
ではさっそくさっきのプログラムを実行してみます
ちゃんと日本語になってますね
というか 「echo /?」 コマンドってエラー扱いかつ stdout にメッセージで stderr は空だったんですね
--icu-data-dir で指定する以外に NODE_ICU_DATA 環境変数にパス指定もできるので よく使うなら full-icu をグローバルインストールして環境変数にそのパスを設定しておくほうがいいかもです
考えてみると Node.js でも ブラウザ JavaScript と同じく TextDecoder があります
それなら別に iconv-lite なくていいんじゃない?と思って試してみました
const { execSync } = require("child_process")
try {
execSync("echo /?")
} catch (err) {
console.log("ERROR")
console.log("stdout:")
console.log(new TextDecoder("shift_jis").decode(err.stdout))
console.log("stderr:")
console.log(new TextDecoder("shift_jis").decode(err.stderr))
}
コマンドプロンプトの出力は sjis になってるので echo のヘルプメッセージを出すコマンドで受け取った stdout と stderr を sjis デコードして console.log します
やってみた結果は
RangeError [ERR_ENCODING_NOT_SUPPORTED]: The "shift_jis" encoding is not supported
サポートされてない……
ドキュメントを見たところ sjis には Full ICU Data が必要みたいです
Full ICU
ICU は Node.js のビルド時に指定してビルドするものみたいです一般に公開されてるバイナリファイルでは full ICU でないビルドみたいです
使われない場合が多いのに重くなるので仕方ないのかも
Node.js のビルド それも自分で設定変えてなんて面倒だなーと思ってましたが Node.js の実行時に読み込むこともできるようです
Full ICU データは npm の full-icu パッケージで取得できるみたいなのでインストールしました
使い方はこんな感じ
node --icu-data-dir=node_modules\full-icu\icudt64l.dat script.js
ではさっそくさっきのプログラムを実行してみます
C:\tmp\js\00>node --icu-data-dir=node_modules\full-icu\icudt64l.dat echo-help.js
ERROR
stdout:
メッセージを表示したり、コマンド エコーの ON と OFF を切り替えます。
ECHO [ON | OFF]
ECHO [メッセージ]
現在のエコー設定を表示するには、パラメーターを指定せずに ECHO と入力してください。
stderr:
ちゃんと日本語になってますね
というか 「echo /?」 コマンドってエラー扱いかつ stdout にメッセージで stderr は空だったんですね
--icu-data-dir で指定する以外に NODE_ICU_DATA 環境変数にパス指定もできるので よく使うなら full-icu をグローバルインストールして環境変数にそのパスを設定しておくほうがいいかもです