気まぐれ更新

JavaScript(Node.js)で文字コードを判別する方法

仕事でjsでアップロードされたファイルの文字コードをチェックする方法について調査したので
備忘録として残しときます

JavaScriptにおける文字コード判別の仕組み

標準関数ではできなさそう。。
いくつかパッケージがあるがコードを見てみると、
Bufferでバイナリ化して正規表現文字コードを判定しているような感じの実装

文字コードを判別してくれるライブラリ

encoding.js

基本的な文字コードを判別するだけなら、これで問題なさそう

github.com

const fs = require('fs');
const encoding = require('encoding-japanese');
  
// utf-8
buf = fs.readFileSync('utf8.txt');
encoding.detect(buf)
> 'ASCII'
  
// Shift-JIS
buf = fs.readFileSync('sjis.txt');
encoding.detect(buf)
> 'SJIS'
  
// EUC-JP
buf = fs.readFileSync('eucjp.txt');
encoding.detect(buf)
> 'EUCJP'

jschardet

判定精度はencoding.jsに比べると微妙?
簡単な検証しかしていないので、なんとも言えないですが。。
対応文字コードが豊富なので、encoding.jsで対応しきれない部分があるならこっちも選択肢としてあり

github.com

const fs = require('fs');
const jschardet = require("jschardet");
  
// utf-8
buf = fs.readFileSync('utf8.txt');
jschardet.detect(buf)
> { encoding: 'ascii', confidence: 1 }
  
// Shift-JIS
buf = fs.readFileSync('sjis.txt');
jschardet.detect(buf)
> { encoding: 'windows-1252', confidence: 0.95 }
  
// EUC-JP
buf = fs.readFileSync('eucjp.txt');
jschardet.detect(buf)
> { encoding: 'EUC-JP', confidence: 0.99 }