created: 2019-11-17T03:34:41.000Z

UTF-8じゃないサイトをaxiosで取得する

axiosはデフォルトでサイトの文字コードをUTF-8決め打ちでデコードしてしまう
なのでUTF-8じゃないサイトを取得すると文字化けする

以下のやり方でUTF-8以外のデコードができるようだ

  • responseTypearraybuffer を指定する
  • transformResponseresponse.data を期待する文字コードにデコードする

自動でエンコーディングを判定してくれるchardetを使うとこんな感じになる

import * as chardet from 'chardet';
import * as iconv from 'iconv-lite';

axios.create({
  responseType: 'arraybuffer',
  transformResponse: data => {
    const encoding = chardet.detect(data);
    if (!encoding) {
      throw new Error('chardet failed to detect encoding');
    }
    return iconv.decode(data, encoding);
  }
})

参考

chardetの仕組みについて

UTF-8じゃないサイトを探す時に役に立った