javascript将readAsBinaryString的结果转换为utf8

时间:2014-06-18 09:45:53

标签: javascript utf-8 filereader

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

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编码不吸引我。

2 个答案:

答案 0 :(得分:0)

结果是一个字符串,因此您可以使用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(' '))

答案 1 :(得分:0)

我在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;
}