1. 確定json文件是UTF-8 無BOM編碼的的。如果有BOM,會在讀取第一行的時候出現(xiàn)亂碼。
Per "fs.readFileSync(filename, 'utf8') doesn't strip BOM markers #1918", fs.readFile is
working as designed: BOM is not stripped from the header of the UTF-8 file, if it exists. It at the discretion of the developer to handle this.
Possible workarounds:
What you are getting is the byte order mark header (BOM) of the UTF-8 file. When JSON.parse sees
this, it gives an syntax error (read: "unexpected character" error). You must strip the byte order mark from the file before passing it to JSON.parse:
fs.readFile('./myconfig.json', 'utf8', function (err, data) { myconfig = JSON.parse(data.toString('utf8').replace(/^\uFEFF/, '')); }); // note: data is an instance of Buffer
2. 確定json沒有格式錯誤。我在用utf8編碼并用utf8 encoding來讀取文件之后依然報錯,百思不得其解。
最后發(fā)現(xiàn)json有兩個editor沒有發(fā)現(xiàn)的格式錯誤,一個是一個數(shù)組中兩個元素之間少了一個“,”,另一個是另一個數(shù)組最后多了一個“,”。
注1:Node的iconv模塊,僅支持linux,不支持Windows,因此要用純js的iconv-lite,另:作者說iconv-lite的性能更好,具體參考Git站點:iconv-lite
注2:我在測試讀寫文件時,始終無法把中文寫入文件,一直亂碼,讀取正常,后來同事幫我發(fā)現(xiàn):js文件的編碼格式是ansi,nodejs的代碼文件必須是utf8格式
注3:如果程序操作的文件,都是以UTF8編碼格式保存的,那么就不需要使用iconv模塊,直接以utf8格式讀取文件即可,如:
// 參數(shù)file,必須保存為utf8格式,否則里面的中文會亂碼 function readFile(file){ // readFile的第2個參數(shù)表示讀取編碼格式,如果未傳遞這個參數(shù),表示返回Buffer字節(jié)數(shù)組 fs.readFile(file, "utf8", function(err, data){ if(err) console.log("讀取文件fail " + err); else{ // 讀取成功時 console.log(data);// 直接
nodejs讀取中文文件編碼問題
準備一個文本文件(當然也可以是csv文件等)test.txt和text.csv,nodejs文件test.js如下:
var iconv = require('iconv-lite'); var fs = require('fs'); var fileStr = fs.readFileSync('D:\\test.csv', {encoding:'binary'}); var buf = new Buffer(fileStr, 'binary'); var str = iconv.decode(buf, 'GBK'); console.log(str);
直接讀文件的話是亂碼,不信你可以試試。需要先統(tǒng)一用二進制編碼方式讀取,然后再用GBK解碼。
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com