我有一个读取字节数组的程序。这些字节应该是ISO-8859-2十进制字符代码。我的测试数组有两个元素:103是字母g
,179是字母ł
(l有尾)。然后我从中创建一个Blob对象,并使用两种方法检查其内容:
第一种方法给出了正确的结果,但第二种方法在保存的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>
答案 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]);
这样,您将保留所需的字节数。