Обновление 2016 - через пять лет в спецификации появились новые методы (см. Поддержку ниже) для преобразования между строками и типизированными массивами с использованием правильной кодировки.
TextEncoder
TextEncoder
представляет :
Интерфейс TextEncoder
представляет кодировщик для определенного метода, который является определенной кодировкой символов, такой как utf-8
, iso-8859-2
, koi8
, cp1261
, gbk
, ... Кодер принимает поток кодовых точек в качестве входных данных и выдает поток байтов.
Изменить примечание, так как написано выше: (там же)
Примечание: Firefox, Chrome и Opera раньше имели поддержку типов кодирования, отличных от utf-8 (таких как utf-16, iso-8859-2, koi8, cp1261 и gbk).Начиная с Firefox 48 [...], Chrome 54 [...] и Opera 41, нет других типов кодирования, кроме utf-8, для соответствия спецификации. *
*) Обновлены спецификации (W3) и здесь (whatwg).
После создания экземпляра TextEncoder
он возьмет строку и закодирует ее, используязаданный параметр кодирования:
if (!("TextEncoder" in window))
alert("Sorry, this browser does not support TextEncoder...");
var enc = new TextEncoder(); // always utf-8
console.log(enc.encode("This is a string converted to a Uint8Array"));
Затем вы, конечно, используете параметр .buffer
в результирующем Uint8Array
, чтобы при необходимости преобразовать подстилающий элемент ArrayBuffer
в другое представление.
Просто убедитесь, что символы в строке соответствуют схеме кодирования, например, если вы используете символы вне диапазона UTF-8, в примере они будут закодированы в два байта вместо одного.
ДляВ общем случае вы будете использовать кодировку UTF-16 для таких вещей, как localStorage
.
TextDecoder
Аналогичным образом, обратный процесс использует TextDecoder
:
Интерфейс TextDecoder
представляет декодер для определенного метода, который представляет собой кодировку определенного символа, например utf-8
, iso-8859-2
, koi8
, cp1261
, gbk
, ... Aдекодер принимает поток байтов в качестве входных данных и выдает поток кодовых точек.
Все доступные типы декодирования можно найти здесь .
if (!("TextDecoder" in window))
alert("Sorry, this browser does not support TextDecoder...");
var enc = new TextDecoder("utf-8");
var arr = new Uint8Array([84,104,105,115,32,105,115,32,97,32,85,105,110,116,
56,65,114,114,97,121,32,99,111,110,118,101,114,116,
101,100,32,116,111,32,97,32,115,116,114,105,110,103]);
console.log(enc.decode(arr));
Библиотека MDN StringView
Альтернативой этому является использование библиотеки StringView
(лицензируется как lgpl-3.0)цель:
- для создания C-подобного интерфейса для строк (т. е. массива кодов символов - ArrayBufferView в JavaScript) на основе интерфейса JavaScript ArrayBuffer
- создать расширяемую библиотеку, которую каждый может расширить, добавив методы к объекту StringView.prototype
- , чтобы создать коллекцию методов для таких строковых объектов (так как теперь: stringViews), которые работают строго с массивамичисла, а не при создании новых неизменяемых строк JavaScript
- для работы с кодировками Unicode, отличными от UTF-16 JavaScript по умолчанию DOMStrings
, что обеспечивает гораздо большую гибкость.Тем не менее, это потребовало бы от нас ссылки или встраивания этой библиотеки, пока TextEncoder
/ TextDecoder
встроен в современные браузеры.
Поддержка
По состоянию на июль / 2018:
TextEncoder
(экспериментальный, на стандартной дорожке)
Chrome | Edge | Firefox | IE | Opera | Safari
----------|-----------|-----------|-----------|-----------|-----------
38 | ? | 19° | - | 25 | -
Chrome/A | Edge/mob | Firefox/A | Opera/A |Safari/iOS | Webview/A
----------|-----------|-----------|-----------|-----------|-----------
38 | ? | 19° | ? | - | 38
°) 18: Firefox 18 implemented an earlier and slightly different version
of the specification.
WEB WORKER SUPPORT:
Experimental, On Standard Track
Chrome | Edge | Firefox | IE | Opera | Safari
----------|-----------|-----------|-----------|-----------|-----------
38 | ? | 20 | - | 25 | -
Chrome/A | Edge/mob | Firefox/A | Opera/A |Safari/iOS | Webview/A
----------|-----------|-----------|-----------|-----------|-----------
38 | ? | 20 | ? | - | 38
Data from MDN - `npm i -g mdncomp` by epistemex