JavaScript判断文件是否为UTF-8编码

 

function readFileToString(code) {
      const reader = new FileReader();
      reader.onload = function() {
        console.log(this.result);
        let str = this.result
        var v8 = new Uint8Array(this.result);
        //if("gbk"===code){
          str = iconv.decode(v8,code) 
       // } 
        
      };
      reader.onerror = e => {
        reject(e);
      };
      reader.readAsArrayBuffer(file);
    }
    (function() {
      const reader = new FileReader();
      reader.onload = function() {
        var v8 = new Uint8Array(this.result);
        if(isUTF8(v8)){
          readFileToString("utf-8")
        }else{
          readFileToString("gbk")
        }
      };
      reader.onerror = e => {
        reject(e);
      };
      reader.readAsArrayBuffer(file);
    })();

 

 

function isUTF8(bytes) {
  var i = 0;
  while (i < bytes.length) {
      if ((// ASCII
          bytes[i] == 0x09 ||
          bytes[i] == 0x0A ||
          bytes[i] == 0x0D ||
          (0x20 <= bytes[i] && bytes[i] <= 0x7E)
      )
      ) {
          i += 1;
          continue;
      }

      if ((// non-overlong 2-byte
          (0xC2 <= bytes[i] && bytes[i] <= 0xDF) &&
          (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF)
      )
      ) {
          i += 2;
          continue;
      }

      if ((// excluding overlongs
          bytes[i] == 0xE0 &&
          (0xA0 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
          (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
      ) ||
          (// straight 3-byte
              ((0xE1 <= bytes[i] && bytes[i] <= 0xEC) ||
                  bytes[i] == 0xEE ||
                  bytes[i] == 0xEF) &&
              (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
              (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
          ) ||
          (// excluding surrogates
              bytes[i] == 0xED &&
              (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x9F) &&
              (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF)
          )
      ) {
          i += 3;
          continue;
      }

      if ((// planes 1-3
          bytes[i] == 0xF0 &&
          (0x90 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
          (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
          (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
      ) ||
          (// planes 4-15
              (0xF1 <= bytes[i] && bytes[i] <= 0xF3) &&
              (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0xBF) &&
              (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
              (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
          ) ||
          (// plane 16
              bytes[i] == 0xF4 &&
              (0x80 <= bytes[i + 1] && bytes[i + 1] <= 0x8F) &&
              (0x80 <= bytes[i + 2] && bytes[i + 2] <= 0xBF) &&
              (0x80 <= bytes[i + 3] && bytes[i + 3] <= 0xBF)
          )
      ) {
          i += 4;
          continue;
      }
      return false;
  }
  return true;
}

 转自:is-utf8/is-utf8.js at master · wayfind/is-utf8 (github.com)

posted @ 2020-12-07 17:54  leechg  阅读(1350)  评论(0编辑  收藏  举报