Рубрики
Без рубрики

Понимание UTF в JavaScript

Понимание UTF в JavaScript

Автор оригинала: Kumar Abhishek.

Обзор

  • JavaScript использует кодировку UTF-16 для строки.
  • Строка формирования персонажа может быть из BMP или Non-BMP Отказ
  • Длина строки – это не что иное, как количество единиц 16-бит-блока памяти. Например, если длина строки составляет 4, это означает, что она имеет 4 единицы 16-битвых широких блоков памяти.
  • Каждое BMP символы могут быть представлены с использованием одного блока 16 битов блока памяти.
  • Каждое не используемые символы не BMP могут быть представлены с использованием 2 единиц 16-битных блоков памяти (I.E 32 бита или 4 октаунта). Например, символы японских или эмодзи могут быть размером 2 единицы.
  • Математически говорящий размер или длина строки в JavaScript имеет вид х + y , х Общее количество символов (включая как BMP, так и не BMP символы), так и y Общее количество символов не BMP (Y – 0 Если строка имеет только символы BMP). То есть для каждого персонажа Non BMP одна дополнительная единица блока памяти 16-битсов способствует общему размеру или длине этой строки.

Иллюстрация

Давайте рассмотрим строку «Hello😛». Теперь мы получаем 7 как длина этой строки:

'Hello😛'.length; // 7

Здесь «H», «E», «l ',' l ',' o ',' 😛 ' составляют 6 единиц до размера (или длины) всей строки. Как '😛' Является ли символ Non BMP, его будет способствовать 1 дополнительной единице. Другими словами, строка имеет 1 символ Non-BMP, который приводит к общему размеру вышеуказанной струны 6 + Отказ Так что связать это с математической формулой х + y мы можем написать х (Общее количество чурки) и y (количество персонажа без BMP ‘😛’).

Подразумеваемое

Мы видели, что строка в JavaScript имеет форму х + y Отказ Также строка в JavaScript – это не что иное, как массив блоков памяти, а не символы. Другими словами, определенный блок памяти в строке S В определенном положении индекса Я может быть получен с использованием s [я] Отказ Самое большое заблуждение между людьми в том, что S [I] средний характер в положении я в строке S Отказ Это верно только для такой строки, которая имеет только символы BMP. В тот момент, когда символ Non-BMP происходит в строке, позиция всех последующих символов затронута из-за того, что характеристики персонажа без BMP более 2 единиц блока памяти. Это может быть понято очень легко, следующим примером:

Рассмотрим строку «Hello😛world». Таким образом, когда мы доступаем к блоку String S по блоку памяти, пока персонаж «O» мы получаем:

s[0] 'H's[1] 'e's[2] 'l's[3] 'l's[4] 'o'

Что вы думаете, ценность S [5] было бы ? Ну, мы получим «�», так как значение блока памяти S [5] не отображается на любого печатающего/рендерируемого символа. «�» – это просто заполнитель, выбранный браузером, чтобы изобразить, что он не может рендерировать такой характер. То же самое верно для S [6], которое показывает «�». Мы можем получить десятичный эквивалент S [5] и S [6] или данных, хранящихся в блоке памяти S [5] и S [6], как показано ниже:

s[5] // '�'s[6] // '�'s[5].charCodeAt(0) // 55357s[6].charCodeAt(0) // 56859

Написание значений блока памяти на S [5] и S [6] в шестнадцатеричном мы получим:

s[5] // 0xD83Ds[6] // 0xDE1B

Так что вместе S [5] и S [6] представляют собой «😛». То есть пара данных пара 0xD83D и 0xDE1B вместе представляют один символ не BMP ‘😛’. Эта пара данных (пара 16-битч) называется Суррогатные пары Отказ

Вызовы

Мы увидели выше, чтобы 2 единицы блоков памяти (суррогатные пары) необходимы для каждого персонажа без BMP, это прививет нормальную итерацию на символы строки в JavaScript. Это препятствует рассмотрению строки в качестве массива характера для количества таких, как подсчет частот символа в строке, замена символа в строку, добавление символов в строке и т. Д. Короче говоря, какая-либо натуральная строка, связанная с ними Персонаж становится ошибочно с наличием символа Non-BMP в строке. К счастью, у нас есть обходные пути для этой проблемы. Мы посмотрим, как этот обходной путь работает дальше.

Обходной путь

Для любой практической цели рассмотрения строки в качестве массива нам сначала нужно сломать строку в массив символов (обоих типов: BMP и Non-BMP). То есть этот массив будет иметь точно такое же количество предметов, что и количество символов (осознавать его не Lenggth или размер строки!). Учитывая тот же пример струны «Hello😛world» Еще раз мы можем преобразовать его в массив символов, как показано ниже:

const [...ca] = 'Hello😛World';ca // (11) ["H", "e", "l", "l", "o", "😛", "W", "o", "r", "l", "d"]

Как и в JavaScript Array элементы, не должны быть однородными, и каждое элементы могут быть любого типа данных, а также любой размер данных. Так над массивом символов CA состоит из 11 предметов, каждый из которых представляет собой символ (типа BMP, так и BMP, так и не BMP SEAMLESLY). Это то, что мы хотели за нашу на основе строкой обработки. Например, если мы хотим подсчитать частоты символов в приведенной выше строке, мы можем получить его, как показано ниже:

const [...ca] = 'Hello😛World';ca.reduce((obj, v) =>	{ obj[v] = obj[v] || 0; ++obj[v]; return obj;	}, {});H: 1e: 1l: 3o: 2😛: 1W: 1r: 1d: 1

Заключение

  • Строка в JavaScript состоит из символов UTF-16 с каждым символом, имеющим размер 1 (в случае символа BMP) или 2 единицы (в случае символов не-BMP) 16-битных блоков памяти.
  • Строка в JavaScript не является массивом символов, а массив памяти блокирует каждый из 16-бит.
  • Каждый символ Non-BMP промежутлен более 2 единичной памяти 16-битров, тем самым вносит одну дополнительную единицу на символ на длину строки.
  • Длина или размер javaScript String можно представить матросмысленно х + y где х общее количество символов и y Общее количество символов не BMP.
  • Оператор Spreade ES6 может использоваться для преобразования строки в массив символов.