文本编码
大约 2 分钟
使用NodeJS
编写前端工具时,操作得最多的是文本文件,因此也就涉及到了文件编码的处理问题。我们常用的文本编码有UTF8
和GBK
两种,并且UTF8
文件还可能带有BOM
。在读取不同编码的文本文件时,需要将文件内容转换为JS
使用的UTF8
编码字符串后才能正常处理。
BOM 的移除
BOM
用于标记一个文本文件使用Unicode
编码,其本身是一个Unicode
字符("\\uFEFF")
,位于文本文件头部。在不同的Unicode
编码下,BOM
字符对应的二进制字节如下:
Bytes | Encoding |
---|---|
FE FF | UTF16BE |
FF FF | UTF16LE |
EF BB BF | UTF8 |
因此,我们可以根据文本文件头几个字节等于啥来判断文件是否包含BOM
,以及使用哪种Unicode
编码。但是,BOM字符
虽然起到了标记文件编码的作用,其本身却不属于文件内容的一部分,如果读取文本文件时不去掉BOM
,在某些使用场景下就会有问题。例如我们把几个JS
文件合并成一个文件后,如果文件中间含有BOM
字符,就会导致浏览器JS
语法错误。因此,使用NodeJS
读取文本文件时,一般需要去掉BOM
。例如,以下代码实现了识别和去除UTF8 BOM
的功能。
function readText(pathname) {
var bin = fs.readFileSync(pathname)
if (bin[0] === 0xef && bin[1] === 0xbb && bin[2] === 0xbf) {
bin = bin.slice(3)
}
return bin.toString('utf-8')
}
GBK 转 UTF8
NodeJS
支持在读取文本文件时,或者在Buffer
转换为字符串时指定文本编码,但遗憾的是,GBK
编码不在NodeJS
自身支持范围内。因此,一般我们借助iconv-lite
这个三方包来转换编码。使用NPM
下载该包后,我们可以按下边方式编写一个读取GBK
文本文件的函数。
var iconv = require('iconv-lite')
function readGBKText(pathname) {
var bin = fs.readFileSync(pathname)
return iconv.decode(bin, 'gbk')
}