В JavaScript есть две функции для декодирования и кодирования строк base64:
btoa() – кодирует строку в Base64:
Но в большинстве браузеров они не работают с кириллицей в UTF-8 и символами эмодзи.
В консоле браузера будет ошибка:
Uncaught DOMException: Failed to execute ‘btoa’ on ‘Window’: The string to be encoded contains characters outside of the Latin1 range.
На сайте есть счётчик обратного отсчёта справа, в голубом поле, после заголовка «Мы — ENTERNET — маркетинговое агентство. «.
В этом счётчике текст отображается некорректно.
Как можно исправить ситуацию? Как поменять кодировку js-файла?
Содержание
- 3 ответа 3
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками кодировка html javascript или задайте свой вопрос.
- Похожие
- 8 ответов
- Кодировка UTF8 ⇢ base64
- Декодирование base64 ⇢ UTF8
- Решение до 2018 года (функционально и хотя, вероятно, лучше поддерживает старые браузеры, но не обновлено)
- Исходное решение (устарело)
- 3 ответа 3
- Всё ещё ищете ответ? Посмотрите другие вопросы с метками кодировка html javascript или задайте свой вопрос.
- Похожие
- 8 ответов
- Кодировка UTF8 ⇢ base64
- Декодирование base64 ⇢ UTF8
- Решение до 2018 года (функционально и хотя, вероятно, лучше поддерживает старые браузеры, но не обновлено)
- Исходное решение (устарело)
3 ответа 3
В заголовке страницы
При объявлении скрипта
Вместо utf8 устанавливайте свою кодировку.
Укажите нужную кодировку через атрибут charset, например так:
Указывайте только charset=»utf-8″, в дальнейшем избежите проблем. Этим вы говорите скрипту в какой кодировки внутри будут все отрабатывать.
К примеру вы указали , и если вы даже укажите в .htaccess -> AddCharset windows-1251 .js и в заголовке страницы.
Скрипт все равно отработает в utf-8
Всё ещё ищете ответ? Посмотрите другие вопросы с метками кодировка html javascript или задайте свой вопрос.
Похожие
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459
Я использую функцию Javascript window.atob() для декодирования строки с кодировкой base64 (в частности, содержимого с кодировкой base64 из API GitHub). Проблема в том, что я возвращаю символы в кодировке ASCII (например, ⢠вместо ™ ). Как я могу правильно обрабатывать входящий base64-кодированный поток так, чтобы он был декодирован как utf-8?
javascript encoding utf-8
8 ответов
152 Решение brandonscript [2015-05-07 19:16:00]
Есть отличная статья о документах Mozilla MDN, которая описывает именно эту проблему:
«Проблема Unicode» Поскольку DOMString — это 16-битные строки, в большинстве браузеров вызов window.btoa для строки Unicode вызовет Character Out Of Range exception если символ превышает диапазон 8-битного байта (0x00
0xFF). Есть два возможных способа решения этой проблемы:
- первый — экранировать всю строку (с UTF-8, см. encodeURIComponent ) и затем кодировать ее;
- второй — преобразовать DOMString UTF-16 в массив символов UTF-8 и затем закодировать его.
Примечание к предыдущим решениям: в статье MDN изначально предлагалось использовать unescape и escape для решения проблемы исключений за Character Out Of Range , но с тех пор они устарели. Некоторые другие ответы здесь предлагают обойти это с помощью decodeURIComponent и encodeURIComponent , это оказалось ненадежным и непредсказуемым. В последнем обновлении этого ответа используются современные функции JavaScript для повышения скорости и модернизации кода.
Если вы пытаетесь сэкономить время, вы также можете использовать библиотеку:
Кодировка UTF8 ⇢ base64
Декодирование base64 ⇢ UTF8
Решение до 2018 года (функционально и хотя, вероятно, лучше поддерживает старые браузеры, но не обновлено)
Вот текущая рекомендация, прямо из MDN, с некоторой дополнительной совместимостью с TypeScript через @MA-Maddin:
Исходное решение (устарело)
Используются escape и unescape (которые сейчас устарели, хотя это работает во всех современных браузерах):
И последнее: я впервые столкнулся с этой проблемой при вызове GitHub API. Чтобы заставить это работать на (Mobile) Safari должным образом, мне фактически пришлось убрать все пустое пространство из источника base64, прежде чем я смог даже декодировать источник. Будет ли это актуально в 2017 году, я не знаю:
Вещи меняются. Методы escape/unescape устарели.
Вы можете кодировать строку URI перед тем, как кодировать ее Base64. Обратите внимание, что это не производит кодирование Base64 UTF8, а скорее данные в кодировке Base64 URL-кодированные. Обе стороны должны согласовать одну и ту же кодировку.
Для решения проблемы OP сторонняя библиотека, такая как js-base64, должна решить проблему.
Если обрабатывать строки в виде байтов больше, вы можете использовать следующие функции
1 Beejor [2017-01-18 09:46:00]
Вот некоторый будущий код для браузеров, которым может не хватать escape/unescape() . Обратите внимание, что IE 9 и старше не поддерживают atob/btoa() , поэтому вам нужно будет использовать для них пользовательские функции base64.
Более полный пример кодирования и декодирования UTF-8 можно найти здесь: http://jsfiddle.net/47zwb41o/
Я хотел бы предположить, что можно хотеть решение, которое производит широко используемый URI base64. Пожалуйста, посетите data:text/plain;charset=utf-8;base64,4pi44pi54pi64pi74pi84pi+4pi/ чтобы увидеть демонстрацию (скопируйте uri данных, откройте новую вкладку, вставьте URI данных в адресную строку, затем нажмите enter, чтобы перейти к страница). Несмотря на то, что этот URI закодирован в base64, браузер все еще может распознавать верхние кодовые точки и правильно их декодировать. Минимальный кодер + декодер составляет 1058 байт (+Gzip → 589)
Ниже приведен исходный код, использованный для его генерации.
Затем для декодирования данных base64 либо HTTP получает данные в виде URI данных, либо использует функцию ниже.
Преимущество большей стандартизации состоит в том, что этот кодер и этот декодер более широко применяются, поскольку их можно использовать в качестве действительного URL-адреса, который отображается правильно. Обратите внимание.
Источник: