The following code (vendor normalized) works perfectly fine and displays "➀➁➂ Test" in Firefox 8, but displays "➀âžâž‚ Test" in Google Chrome. Is there any way to preserve encoding of blobs in Google Chrome short of writing a file to a temporary filesystem using the filesystem API?
var b = new Blob(["➀➁➂ Test"], {type: "text/plain;charset=UTF-8"});
var url = URL.createObjectURL(b);
open(url);
You can't adjust Chrome's encoding settings, but you can try using an extension to fix issues with garbled text. Visit the Chrome Web Store. At the top left, click Extensions. Enter "Garbled text" in the search bar.
The reason is that BLOBs are treated in the same manner as strings because they have already been encoded by using base64 encoding before storage into a dictionary file. BLOBs stored in Spreadsheet Data Model files MUST be encoded by using base64 encoding prior to any other compression and storage.
Blobs are created in a renderer process, where their data is temporarily held for the browser (while Javascript execution can continue). When the browser has enough memory quota for the blob, it requests the data from the renderer. All blob data is transported from the renderer to the browser.
Gmail: Click on the Gear at the top right corner next to you email address and select Mail settings. Under the General tab go to the bottom and change Outgoing message encoding to: Use Unicode (UTF-8) encoding for outgoing messages. Then click Save Changes> button at the bottom.
new Blob(["➀➁➂ Test"])
will generate a Blob representing that text encoded as UTF-8.
That browsers assumes text files should be read in ISO is a weird choice IMM.
Appending the { type: "text/plain;charset=utf8" }
should generate the proper Content-Type
header when they browsers will serve it through a blob URI. That Chrome doesn't with open()
sounds like a bug.
Now you can workaround this by prepending a BOM sequence at the beginning of your text file, so that Chrome detects it as UTF, even without Content-Type info:
var BOM = new Uint8Array([0xEF,0xBB,0xBF]);
var b = new Blob([ BOM, "➀➁➂ Test" ]);
var url = URL.createObjectURL(b);
open(url);
var BOM = new Uint8Array([0xEF,0xBB,0xBF]);
var blob_BOM = new Blob([ BOM, "➀➁➂ Test" ]);
var url_BOM = URL.createObjectURL(blob_BOM);
// for demo we also create one version without BOM
var blob_noBOM = new Blob([ "➀➁➂ Test" ]);
var url_noBOM = URL.createObjectURL(blob_noBOM);
document.querySelector('.BOM').href = url_BOM;
document.querySelector('.no-BOM').href = url_noBOM;
// to check whether they contain the same data, apart from the BOM
(async() => {
const buf_BOM = await blob_BOM.slice(3).arrayBuffer(); // remove BOM sequence
const buf_noBOM = await blob_noBOM.arrayBuffer();
console.log( 'with BOM text data:' );
console.log( JSON.stringify( [...new Uint8Array( buf_BOM )] ) );
console.log( 'without BOM text data:' );
console.log( JSON.stringify( [...new Uint8Array( buf_noBOM )] ) );
})();
<a class="BOM">open file with BOM</a><br>
<a class="no-BOM">open file without BOM</a>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With