背景:用户导入一个txt文件,node把文件里的内容存数据库
node标准包里并没有判断文件编码格式的方法(判断buffer的也没有)。在网上搜索,看到有按文件buffer头几个值做判断的,亲测不可用(貌似只对文件开头是空格的文件管用)
哎,我笨啊,又着急,竟想出了一个个编码试,试到没乱码为止(闭嘴,我笨我不知道,还要你说)
let buffer = buffer.toString('utf8',0,buffer.length)
if (data.indexOf('�') >= 0 || data.indexOf('') >= 0) {
console.info('文件格式:ascii')
data = iconv.decode(buffer, 'GBK')
}
if (data.indexOf('�') >= 0 || data.indexOf('') >= 0) {
console.info('文件格式:union')
data = iconv.decode(buffer, 'utf16')
}
虽然笨,但速度上并没有感觉慢(7.7M文件)
JsChardet:https://github.com/aadsm/jschardet/blob/master/README.md
看源码发现:(universaldetector.js P82-113)Bom类型的文件,其它类型的好像用了大量数据做对比,因为它的min.js里是这样的
jschardet.min.js调用
var jschardet = require("jschardet")
// "àíàçã" in UTF-8
jschardet.detect("\xc3\xa0\xc3\xad\xc3\xa0\xc3\xa7\xc3\xa3")
// { encoding: "UTF-8", confidence: 0.9690625 }
// "次常用國字標準字體表" in Big5
jschardet.detect("\xa6\xb8\xb1\x60\xa5\xce\xb0\xea\xa6\x72\xbc\xd0\xb7\xc7\xa6\x72\xc5\xe9\xaa\xed")
// { encoding: "Big5", confidence: 0.99 }
网友评论