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)

  • 相关阅读:
    第七章LED将为我闪烁:控制发光二极管
    第六章第一个Linux驱动程序:统计单词个数
    搭s3c6410开发板的测试环境读后感
    第四章源代码的下载和编译
    第三章Git使用入门(读后感)
    第二章:搭建Android开发环境(读后感)
    第一章:Android系统移植与驱动开发概述(读后感)
    函数和代码复用
    python的基本数据类型
    Python的语法元素
  • 原文地址:https://www.cnblogs.com/Leechg/p/14098473.html
Copyright © 2011-2022 走看看