【问题标题】:javascript convert to utf8 the result of readAsBinaryStringjavascript 将 readAsBinaryString 的结果转换为 utf8
【发布时间】:2014-06-18 09:45:53
【问题描述】:

我有一个格式如下的文件:

utf-8 encoded text block
separator 
binary data block

我使用 JavaScript 的 FileReader 以二进制字符串的形式读取文件

FileReader.readAsBinaryString 像这样:

var reader = new FileReader();

reader.onload  = function(evt){
    // Here I use the separator position to divide the file content into
    // header and binary
    ...
    console.log(header);

};
FileReader.onerror = function (evt) {
    onFailure(evt.target.error.code);
}

reader.readAsBinaryString(blobFile);

标头未解析为 UTF-8。我知道 FileReader.readAsText 会考虑文件的编码,而 FileReader.readAsBinaryString 会逐字节读取文件。

如何将标头转换为 utf8?两次读取文件,一次作为二进制字符串读取二进制数据,再次作为文本以 utf8 编码获取第一个块,这对我没有吸引力。

【问题讨论】:

    标签: javascript utf-8 filereader


    【解决方案1】:

    我在http://snipplr.com/view/31206/ 上找到了答案: 我已经在法语字符上对其进行了测试,然后它可以毫无问题地转换为 utf8。

    function readUTF8String(bytes) {
      var ix = 0;
    
      if (bytes.slice(0, 3) == "\xEF\xBB\xBF") {
        ix = 3;
      }
    
      var string = "";
      for (; ix < bytes.length; ix++) {
        var byte1 = bytes[ix].charCodeAt(0);
        if (byte1 < 0x80) {
          string += String.fromCharCode(byte1);
        } else if (byte1 >= 0xC2 && byte1 < 0xE0) {
          var byte2 = bytes[++ix].charCodeAt(0);
          string += String.fromCharCode(((byte1 & 0x1F) << 6) + (byte2 & 0x3F));
        } else if (byte1 >= 0xE0 && byte1 < 0xF0) {
          var byte2 = bytes[++ix].charCodeAt(0);
          var byte3 = bytes[++ix].charCodeAt(0);
          string += String.fromCharCode(((byte1 & 0xFF) << 12) + ((byte2 & 0x3F) << 6) + (byte3 & 0x3F));
        } else if (byte1 >= 0xF0 && byte1 < 0xF5) {
          var byte2 = bytes[++ix].charCodeAt(0);
          var byte3 = bytes[++ix].charCodeAt(0);
          var byte4 = bytes[++ix].charCodeAt(0);
          var codepoint = ((byte1 & 0x07) << 18) + ((byte2 & 0x3F) << 12) + ((byte3 & 0x3F) << 6) + (byte4 & 0x3F);
          codepoint -= 0x10000;
          string += String.fromCharCode(
            (codepoint >> 10) + 0xD800, (codepoint & 0x3FF) + 0xDC00
          );
        }
      }
    
      return string;
    }
    

    【讨论】:

      【解决方案2】:

      结果是一个 atring,因此您可以使用 String.fromCharCode 之类的方法迭代每个字节并将其转换为它的 ascii 表示。

        var cursor=0
        var header=""; 
         while(cursor!=blob.length && blob[cursor]!=/*separator code*/){
          header+=String.fromCharCode(blob[cursor]);
          cursor+=1;
         }
      
         or
      
         var pos=blob.indexOf(/*separator*/);
         var header=String.fromCharCode.apply(this,blob.substr(0,pos).split(' '))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多