保存为文件的Javascript Blob对象包含额外的字节

时间:2014-05-08 07:57:10

标签: javascript character-encoding

我有一个读取字节数组的程序。这些字节应该是ISO-8859-2十进制字符代码。我的测试数组有两个元素:103是字母g,179是字母ł(l有尾)。然后我从中创建一个Blob对象,并使用两种方法检查其内容:

  1. 的FileReader
  2. 的ObjectURL
  3. 第一种方法给出了正确的结果,但第二种方法在保存的blob文件中提供了一个额外的字符。

    以下是代码:

    var bytes = [103, 179];
    var chr1 = String.fromCharCode(bytes[0]);
    var chr2 = String.fromCharCode(bytes[1]);
    var str = '';
    str += chr1;
    str += chr2;
    console.log(str.charCodeAt(0)); //103
    console.log(str.charCodeAt(1)); //179
    console.log(str.charCodeAt(2)); //NaN
    
    var blob = new Blob([str]);
    console.log(blob.size); //3
    
    //Checking Blob contents using first method - FileReader
    var reader = new FileReader();
    reader.addEventListener("loadend", function() {
        var str1 = this.result;
        console.log(str1); //g³
        console.log(str1.charCodeAt(0)); //103
        console.log(str1.charCodeAt(1)); //179
        console.log(str1.charCodeAt(2)); //NaN
    });
    reader.readAsText(blob);
    
    //Checking Blob contents using second method - objectURL
    var url = URL.createObjectURL(blob);
    $('<a>',{
        text: 'Download the blob',
        title: 'Download',
        href: url
    
    }).appendTo('#my');
    

    为了使用第二种方法,我创建了一个fiddle。在小提琴中,当你点击&#34;下载&#34;链接并保存,然后在二进制编辑器中打开文件,它由以下字节组成:103,194,179。

    我的问题是,194来自何处以及如何创建blob文件(使用createobjectURL方法)仅包含原始数组中给出的字节(在本例中为[103,179])。 / p>

1 个答案:

答案 0 :(得分:1)

额外的194来自编码问题:

179是“SUPERCRIPT THREE”的unicode代码点,因此字符串str将包含“g³”。创建blob后,您将获得以utf8编码的字符串:0x67表示g,0xC2 0xB3表示³(194,179十进制),需要3个字节。当然,如果你使用FileReader,你将得到2个字符,“g³”。

为了避免这种情况(如果你不想在utf8中放置所有),你可以使用一个类型化的数组来构造blob:

var u8 = new Uint8Array(bytes);
var blob = new Blob([u8]);

这样,您将保留所需的字节数。