2014-12-10 6 views
1

Я знаю, что это, наверное, глупый вопрос, но я должен быть уверен в этой проблеме. Так что мне нужно знать, например, если язык программирования говорит, что его тип Строка использует UTF-16 кодировке, это означает:Являются ли суррогатные пары единственным способом представления кодовых точек более 2 байтов в UTF-16?

  1. он будет использовать 2 байта для кодовых точек в диапазоне от U + 0000 до U + FFFF.
  2. он будет использовать суррогатные пары для кодовых точек больше U + FFFF (4 байта на кодовую точку).

Или некоторые языки программирования используют свои собственные «трюки» при кодировании и не следуют этому стандарту 100%.

ответ

2

UTF-16 - это кодированное кодирование, поэтому, если вы используете UTF-16, то вы делаете то, что он говорит, и не придумывайте никаких «трюков».

Я бы не говорил о «двух байтах», как вы это делаете. Это деталь. Ключевой частью UTF-16 является то, что вы кодируете кодовые точки в виде последовательности из 16-разрядных блоков кода, а пары суррогатов используются для кодирования кодовых точек больше 0xFFFF. Тот факт, что один блок кода состоит из двух 8-битных байтов, является вторым уровнем детализации, который применяется ко многим системам (но существуют системы с большими размерами байтов, где это не имеет значения), и в этом случае вы можете различать большие - и мало-endian представления.

Но, глядя в другую сторону, нет абсолютно никаких причин, почему вы должны использовать использовать UTF-16 специально. В конечном итоге текст Unicode представляет собой просто последовательность чисел (значение до 2), и вам решать, как их представлять и сериализовать.

Я бы с радостью отметил, что UTF-16 - это историческая авария, которую мы, вероятно, не сделали бы, если бы нам пришлось переделать все сейчас: это кодировка переменной длины, как UTF-8, поэтому вы получаете нет произвольного доступа, в отличие от UTF-32, но он также многословен. В отличие от UTF-8 он страдает от проблем с контентом. Хуже всего то, что он смешивает части стандарта Unicode с внутренним представлением, используя фактические значения кодовой точки для суррогатных пар.

Единственная причина, по-моему, в том, что UTF-16 существует потому, что в какой-то ранний момент люди полагали, что 16 бит будет достаточным для всего человечества навсегда, и поэтому UTF-16 будет рассматриваться как окончательное решение (например, UTF-32 сегодня). Когда это оказалось не так, суррогаты и более широкие диапазоны были привязаны к UTF-16. Сегодня вы должны в основном использовать UTF-8 для сериализации извне или UTF-32 для эффективного доступа внутри. (Возможно, существуют дополнительные предпосылки для предпочтения, возможно, UCS-2 для чистого азиатского текста.)

0

UTF-16 сам по себе является стандартным. Однако большинство языков, строки которых основаны на 16-битных блоках кода (независимо от того, поддерживают они или нет) UTF-16, могут использовать любую последовательность единиц кода, включая недействительные суррогаты. Например, это, как правило, является приемлемым строковый литерал:

"x \uDC00 y \uD800 z" 

и, как правило, вы получите только сообщение об ошибке при попытке записать его в другой кодировке.

Опциональный вариант кодирования/декодирования Python surrogateescape использует такие недействительные суррогаты для пропусков токенов, представляющих одиночные байты 0x80-0xFF, в автономные суррогатные коды U + DC80-U + DCFF, в результате чего получается такая строка. Обычно это используется только внутри, так что вы вряд ли встретите его в файлах или на проводе; и он применяется только к UTF-16, так как тип данных Python str основан на 16-битных кодовых модулях (который находится на «узких» строках между 3.0 и 3.3).

Я не знаю других распространенных расширений/вариантов UTF-16.