• 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)

  • 相关阅读:
    树莓派4B
    SpringBoot 自定义 info Actuator 原理
    RestTemplate翻译serviceId过程
    ISA, ABI, API区别
    01.编译器结构
    【Git123】Git SSH Key支持多账号
    【消息中间件123】Solace PubSub+ Event Broker介绍
    【ETL123】
    【Http123】Http Timeout
    【性能123】Linux性能之“平均负载”
  • 原文地址:https://www.cnblogs.com/Leechg/p/14098473.html
Copyright © 2020-2023  润新知