Строки JavaScript — UTF-16 против UCS-2?

В некоторых местах я читал, что строки JavaScript имеют кодировку UTF-16, а в других — UCS-2. Я немного поискал, чтобы попытаться понять разницу, и нашел это:

В: В чем разница между UCS-2 и UTF-16?

A: UCS-2 — это устаревшая терминология, которая относится к реализации Unicode вплоть до Unicode 1.1, до того, как суррогатные кодовые точки и UTF-16 были добавлены в версию 2.0 стандарта. Теперь следует избегать этого термина.

UCS-2 не определяет отдельный формат данных, поскольку UTF-16 и UCS-2 идентичны для целей обмена данными. Оба являются 16-битными и имеют точно такое же представление единицы кода.

Иногда в прошлом реализация была помечена как «UCS-2», чтобы указать, что она не поддерживает дополнительные символы и не интерпретирует пары суррогатных кодовых точек как символы. Такая реализация не будет обрабатывать свойства символов, границы кодовых точек, сопоставление и т. д. для дополнительных символов.

через: http://www.unicode.org/faq/utf_bom.html#utf16 -11

Итак, мой вопрос: это потому, что методы и индексы строкового объекта JavaScript действуют на 16-битные значения данных вместо символов, что заставляет некоторых людей считать его UCS-2? И если да, то будет ли строковый объект JavaScript, ориентированный на символы, а не на 16-битные фрагменты данных, считаться UTF-16? Или есть что-то еще, что мне не хватает?

Редактировать: В соответствии с запросом, вот некоторые источники, в которых говорится, что строки JavaScript являются UCS-2:

http://blog.mozilla.com/nnethercote/2011/07/01/faster-javascript-parsing/ http://terenceyim.wordpress.com/tag/ucs2/

EDIT: всем, кто может столкнуться с этим, обязательно перейдите по этой ссылке:

http://mathiasbynens.be/notes/javascript-encoding


person patorjk    schedule 03.01.2012    source источник


Ответы (3)


JavaScript, строго говоря, ECMAScript, предшествует Unicode 2.0, поэтому в некоторых случаях вы можете найти ссылки на UCS-2 просто потому, что это было правильно на момент написания ссылки. Можете ли вы указать нам на конкретные цитаты JavaScript как «UCS-2»?

Спецификации для ECMAScript версий 3 и 5, по крайней мере, явно объявляют строку как набор 16-битных целых чисел без знака и что если эти целочисленные значения предназначены для представления текстовых данных, то они являются кодом UTF-16. единицы. См. раздел 8.4 Спецификации языка ECMAScript.


EDIT: я больше не уверен, что мой ответ полностью правильный. См. превосходную статью, упомянутую выше, http://mathiasbynens.be/notes/javascript-encoding, что, по сути, говорит о том, что, хотя движок JavaScript может использовать UTF-16 внутри, и большинство из них так и делает, сам язык эффективно предоставляет эти символы, как если бы они были UCS-2.

person dgvid    schedule 03.01.2012
comment
Спасибо за ссылку, язык спецификации кажется довольно ясным. Тогда я думаю, что разговоры о UCS-2 либо устарели, либо основаны на методе и поддержке индексации суррогатных пар. - person patorjk; 03.01.2012
comment
Итак, в спецификации указано, что каждое целочисленное значение в последовательности обычно представляет собой одну 16-битную единицу текста UTF-16. Однако ECMAScript не накладывает никаких ограничений или требований на значения, за исключением того, что они должны быть 16-разрядными целыми числами без знака, что эквивалентно утверждению, что в современных программах на C каждое символьное значение в массиве символов обычно представляет собой одну 8-битную единицу. текста UTF-8, но, очевидно, утверждение, что строки C являются UTF-8, было бы неправильным. Семантика, которую предоставляет JavaScript, — это только UCS-2; если вам нужна поддержка UTF-16, вы должны сделать это самостоятельно, согласно ответу DMoses. - person Jay Freeman -saurik-; 11.12.2012
comment
UCS — это штука с числами, и да, UCS 2 устарела, текущая версия — UCS 4. UTF-8/-16/-32 — это способы представления массивов штуковин UCS в битах. ;) - person Philip; 11.06.2017


Это просто 16-битное значение без кодировки, указанной в стандарте ECMAScript.

См. раздел 7.8.4 Строковые литералы в этом документе: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

person Daniel A. White    schedule 03.01.2012