見出し画像

TypeScriptでISO-2022-JP(JISコード)のデコード

お久しぶりです。今日はニッチなネタになります。

ISO-2022-JP(JISコード)っていうのは、メール本文のエンコードに使われているものです。これをデコードして読めるようにしたいんです。

今日の内容は、結局、どのnpmパッケージを使うか?ってことです。まず、以下の通り、ざっと検討しました。

・iconv-lite: 一番メジャーだけど、ISO-2022-JP(JISコード)には対応してない。Shift_JISは対応してるが別だと思う。
・iconv: VC++再配布可能パッケージが必要。配布が面倒。
・jconv: 使えるけど、ダウンロード数少なすぎ。最終更新が8年前。
・encoding-japanese: 使い方が分かりにくかったけど、これに落ち着いた(最終更新は2年前だけど)。

encoding-japaneseを使うならこう書きます(これがすぐには分からなかった)。

const dataTextBuf = Buffer.from(dataText);
const mailBodyTextIntArray = encjp.convert(dataTextBuf, 'UTF8', 'JIS');
const mailBodyTextBuf = Buffer.from(mailBodyTextIntArray);
const mailBodyText = mailBodyTextBuf.toString();

// 最後の2行はこちらも可。
const mailBodyText = new TextDecoder().decode(
   new Uint8Array(mailBodyTextIntArray)
);

encoding-japaneseに決める前に、こちらも見ました。

・@kenjiuno/iconvlite-wrapper-with-iso2022jp

ダウンロード数が少なすぎるので使う気にはならないですが、iconv-liteをラップしてるというので、どうラップしてるのか、それが分かれば、それを自分でやろうと思って見たのですが、引数にiso2022jpと来たらJISに読み替えてるだけでした。あれ?iconvliteって、JIS扱えるの?ってなりました。実際、'JIS'を指定してやってみたんですが、ダメでした。最終更新が3年前なので、この3年の間に、iconv-liteのJIS対応が無くなったということなのか。。元々、ダメで、試しに作っただけなのか。。わざわざ対応していたものを削るとは考えにくいので、おそらく、後者な気がします。ちなみに、iconv-liteは以下のようにサポート対象かどうか判定できますが、いずれも、falseでした。

const exist = iconvLite.encodingExists('JIS');
const exist2 = iconvLite.encodingExists('ISO-2022-JP');
const exist3 = iconvLite.encodingExists('iso-2022-jp');
const exist4 = iconvLite.encodingExists('iso2022jp');

というわけで、encoding-japaneseで行こうと思います。

以上になります。

この記事が気に入ったらサポートをしてみませんか?