zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    IO模型(一)
    协程(效率最快、重点)--初识协程、gevent模块、协程爬虫、协程socket(一)
    servlet工作原理解析
    servlet:servletconfig对象和它在开发过程中的应用场景
    servlet:线程安全问题
    servlet:启动的时机
    servlet:第一个demo
    安装myeclipse的一些配置
    同时安装32和64位的jdk
    fiddler:网络限速
  • 原文地址:https://www.cnblogs.com/Leechg/p/14098473.html
Copyright © 2011-2022 走看看