amebano20190913のブログ

amebano20190913のブログ

ブログの説明を入力します。

いわゆるシフトJISだといくつかあるようだが、

MS932をサポートしているものはiconv-liteしか見つけられなかった。

厳密にはシフトJISとMS932は違うようなので、これを採用した。

 

まぁ、昨今のweb開発でUTF-8以外で開発とかかなり稀だが、

csvダウンロード/アップロードだとほぼシフトJIS系になる。

ここで文字コード変換が必要になるのだが、

使わせてもらって言うのもなんだが、

 

ドキュメントがクソだ。

 

UTF-8からMS932へ変換したいだけなのに、

公式ドキュメントのBasic APIを見るとdecode、encodeが出てくる。

どっち使うんだ???

とふつうは思うのだが、

この公式ドキュメントには全く記述がない。

 

結局、encodeを使うのが正解で、

const str932 = iconv.encode('あいうえお', 'MS932');

となる。

str932には変換後の

[0x82, 0xa0, 0x82, 0xa2, 0x82, 0xa4, 0x82, 0xa6, 0x82, 0xa8]

が入っているのだが

typescriptだとBuffer型になるため、こいつがnuxt3には入ってない。

(標準ビルドでviteを使っているため?node特有のrequireなどもビルド結果に含めてもらえない)

まぁ、BlobがBufferをそのまま受け入れてくれるので

new Blob([str932], {'type' : 'text/plain' });して

このあとはURL.createObjectURLしてAリンク作成してそのリンクのクリックを呼ぶと

ブラウザがBlobの内容をダウンロードしてcsvファイルにくれる。

 

ここまでたどり着くのに1時間以上要した。

npmでBufferだけ入れてみたり、あっちこっちサンプルを探しまくった。

 

いろいろやって判明したのは

iconvというコマンドツールが元々あった?

このiconvがデフォルトでUTF-8になっている。

なのでiconv-liteも

UTF-8<===>シフトJIS、JIS、EUC

これが基本。

なのでUTF-8を介さない以下のようなことはできない?

EUC<===>シフトJIS

まぁ、これは問題ないけど、

 

MS932への変換

UTF-8===>MS932

これはencode

MS932===>UTF-8

これはdecodeになるわけです!!!!!

世界はUTF-8を中心に回ってるためです。

UTF-8以外の文字コードは暗号化されたデータと同じ扱いです。

 

 

なのでドキュメントもそれが当たり前となるわけで

これに気付けない人は時間を無駄にして大いに疲れるのです。