javascript 将 readAsBinaryString 的结果转换为 utf8

标签 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);

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

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

最佳答案

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

关于javascript 将 readAsBinaryString 的结果转换为 utf8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24282294/

相关文章:

reactjs - 如何在 React 中使用 FileReader? (得到一个奇怪的错误)

javascript - 安装 Gulp 会给我这些警告

javascript - 如何在 Angular JS 中使用 img 标签?

C# 和 utf8_decode

java - 在 Eclipse 编辑器中显示中文注释

javascript - FileReader 读取文件未定义结果

javascript - 如何使用 angular-filter 库实现二级分组?

javascript - 当您在 iOS 中将 Web 应用程序添加到主屏幕时,您将无法再存储 cookie

java - 如何在 Netbeans 控制台中打印希伯来语字符

HTML5 FileReader api 纵向问题