javascript кодировка utf 8

В 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-файла?

Содержание

  1. 3 ответа 3
  2. Всё ещё ищете ответ? Посмотрите другие вопросы с метками кодировка html javascript или задайте свой вопрос.
  3. Похожие
  4. 8 ответов
  5. Кодировка UTF8 ⇢ base64
  6. Декодирование base64 ⇢ UTF8
  7. Решение до 2018 года (функционально и хотя, вероятно, лучше поддерживает старые браузеры, но не обновлено)
  8. Исходное решение (устарело)

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-адреса, который отображается правильно. Обратите внимание.

Источник: computermaker.info

Техника и Гаджеты
Добавить комментарий