Указание кодировки BLOB-объектов в Google Chrome - PullRequest
11 голосов
/ 13 июля 2011

Следующий код (нормализовано поставщиком) прекрасно работает и отображает «➀➁➂ Test» в Firefox 8, но отображает «âžâ âžâž‚ Test »в Google Chrome. Есть ли способ сохранить кодирование больших двоичных объектов в 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);

Ответы [ 2 ]

10 голосов
/ 09 апреля 2012

Gecko (Firefox), WebKit (Safari, Chrome) и Opera поддерживают нестандартную функцию btoa для кодирования строки в base 64. Чтобы получить строку base 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 data: -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","");
0 голосов
/ 29 августа 2011

Проблема заключается в кодировке страницы по умолчанию для новых вкладок в Chrome.Когда откроется новое окно (после window.open(url)), выберите «Вид»> «Кодировка»> «Юникод» в меню Chrome.Это изменило отображаемый текст с «Проверка» на «Тест» для меня в Chrome 13.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...