Подтвердить что ты не робот

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

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

Q: В чем разница между 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/

РЕДАКТИРОВАТЬ. Для всех, кто может столкнуться с этим, не забудьте проверить эту ссылку:

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

4b9b3361

Ответ 1

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

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


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

Ответ 2

Это UTF-16/USC-2. Он может обрабатывать суррогатные пары, но charAt/charCodeAt возвращает 16-разрядный char, а не код Unicode. Если вы хотите, чтобы он обрабатывал суррогатные пары, я предлагаю быстро прочитать this.