Строки JavaScript - UTF-16 против UCS-2? - PullRequest
25 голосов
/ 03 января 2012

В некоторых местах я читал, что строки 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

Ответы [ 3 ]

18 голосов
/ 03 января 2012

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

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


РЕДАКТИРОВАТЬ : я больше не уверен, что мой ответ полностью верен.См. Превосходную статью, упомянутую выше, http://mathiasbynens.be/notes/javascript-encoding,, в которой, по сути, говорится, что, хотя движок JavaScript может использовать UTF-16 для внутреннего использования, и большинство этого делает, сам язык эффективно предоставляет эти символы, как если бы они были UCS-2.

8 голосов
/ 03 января 2012

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

2 голосов
/ 03 января 2012

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

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

...