Задание кодировки 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.