Задание кодировки blob в Google Chrome

Следующий код (нормализованный поставщик) отлично работает и отображает "➀➁➂ Test" в Firefox 8, но отображает "âž € âžâž, Test" в Google Chrome. Есть ли способ сохранить кодировку blob в Google Chrome, не записывая файл во временную файловую систему, используя API файловой системы?

var bb = new BlobBuilder;
bb.append("➀➁➂ Test");
var b = bb.getBlob("text/plain;charset=UTF-8");
var url = URL.createObjectURL(b);
open(url);

Ответ 1

Gecko (Firefox), WebKit (Safari, Chrome) и Opera поддерживают нестандартную btoa функцию для кодирования строки в базе 64. Чтобы получить базовую 64 строку, содержащую строку, кодированную как UTF-8, вы необходимо использовать трюк encodeURIComponent - unescape. encodeURIComponent кодирует строку как URL-адрес UTF-8, но unescape декодирует каждый %xx как один символ. btoa ожидает двоичную строку любой кодировки, которую вы хотите.

var base64 = btoa(unescape(encodeURIComponent(data)));
window.open("data:text/plain;charset=UTF-8;base64,"+base64,"UTF-8 Text");

Конечно, это не работает в IE, но я думаю, что IE 10 будет поддерживать Blob -API. Кто знает, как он будет обрабатывать кодировки.

PS: IE, похоже, не может window.open данных: -urls и в любом случае будет иметь смехотворное ограничение длины URL-адреса.

PPS: Это работает для меня в Chrome:

var b = new Blob(["➀➁➂ Test"],{encoding:"UTF-8",type:"text/plain;charset=UTF-8"});
var url = URL.createObjectURL(b);
window.open(url,"_blank","");

Ответ 2

Проблема заключается в кодировке по умолчанию для новых вкладок в Chrome. Когда откроется новое окно (после window.open(url)), выберите "Просмотр" > "Кодирование" > "Юникод" в меню Chrome. Это изменило отображаемый текст от "âž € âžâž, Test" до "➀➁➂ Test" для меня в Chrome 13.

Если вам нужно решение, которое позволит вам открывать капли в новых окнах, независимо от кодировки по умолчанию, то вы можете полагаться на то, что документ в iframe наследует кодировку родительского документа, если он явно не указывает его собственное кодирование. Таким образом, вы можете открыть окно с пустым HTML-документом, который подается с заголовком Content-Type:text/html; charset=utf-8, а затем добавить iframe в тело с атрибутом src, установленным на URL-адрес blob.