nodejs編碼只支持utf8的編碼方式,無論是打開某個文件或者寫.js腳本都得以utf8的編碼方式保存,不然程序無法運行,讀出來的文件是亂碼。
如果是在前台,讀取文件是通過FileReader或者FileReaderSync這兩個webAPI和input[type='file']標簽來配合來完成,但是這個兩個API已經包涵了判斷文件的編碼方式的功能,無論是GBK還是utf8編碼的文件都能正確打開不出現亂碼,但是nodejs就會出現這樣的問題,讀取gbk和unicode編碼的文件出現奇怪的亂碼,有一個模塊iconv-lite可以解決編碼問題,但是前提是你得知道這個文件的編碼方式,舉個例子:
有一個gkb的文件叫gbk.txt正確查看它的方式如下:
var icon=require('iconv-lite');
var fs=require('fs')
fs.readFile('gbk.txt',function(err,buffer){
var str=iconv.decode(buffer,'gbk')
console.log(str)//得到無亂碼的內容
})
但是如果不知道文件的編碼方式,那有該怎么辦呢?
那就來聊一聊編碼方式,首先UNICODE編碼,UNICODE編碼的文件無論內容是什么,前兩個字節要不是FF FE 或者 FE FF,
utf-8頭兩個字節是EF BB,至於gbk吧,目前我沒找到判斷方法,只能粗略的判斷如果不是unicode和utf8就認為是GBK,
代碼如下:
var fs=require('fs')
fs.readFile('code.txt',function(err,buffer){
if(buffer[0]==0xff&&buffer[1]==0xfe){
console.log('unicode')
}else if(buffer[0]==0xfe&&buffer[1]==0xff){
console.log('unicode')
}else if(buffer[0]==0xef&&buffer[1]==0xbb){
console.log('utf8')
}else{
console.log('else')
}
})