JavaScript(Node.js)で文字コードを判別する方法
仕事でjsでアップロードされたファイルの文字コードをチェックする方法について調査したので
備忘録として残しときます
JavaScriptにおける文字コード判別の仕組み
標準関数ではできなさそう。。
いくつかパッケージがあるがコードを見てみると、
Bufferでバイナリ化して正規表現で文字コードを判定しているような感じの実装
文字コードを判別してくれるライブラリ
encoding.js
基本的な文字コードを判別するだけなら、これで問題なさそう
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で対応しきれない部分があるならこっちも選択肢としてあり
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 }