node判断文件编码格式

2019-02-19  本文已影响0人  我叫Aliya但是被占用了

背景:用户导入一个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 }
上一篇 下一篇

猜你喜欢

热点阅读