Путаница с Unicode и количеством битов, необходимых для представления символа - PullRequest
0 голосов
/ 08 марта 2012

Я смущен тем фактом, что в Юникоде есть 1114,112 символов, но в то же время мы можем использовать UTF-16 (который использует 16 бит) для доступа ко всем символам. Я имею в виду, не требуется ли для хранения 32-битный код?

Я слышал, что это связано с суррогатными парами, но я понятия не имею, что они на самом деле.

Ответы [ 2 ]

2 голосов
/ 08 марта 2012

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

Быстро стало ясно (также из-за некоторых изменений в объеме проекта), что 16битов и, следовательно, 65536 символов слишком мало для работы, и Unicode был расширен до 21 бита, организованных в 17 плоскостей , из которых первые 65536 символов образуют 0-й, Базовую многоязычную плоскость (BMP).

В то же время 2048 кодовых точек в BMP были выделены как так называемые высокие и низкие суррогаты.Два из которых будут представлять персонажа в другой плоскости.Это включило UTF-16, где каждый код единица по-прежнему имеет длину в два байта, а одна или две единицы кода (в последнем случае путем объединения суррогата высокого и низкого уровня) будут представлять один код точка .Кроме того, было объявлено, что эти суррогаты не могут появляться в изоляции или в неправильном порядке.Суррогатные символы - это, в основном, странность (они образуют самый большой блок не-символов в Юникоде), но технически они были наиболее чистым способом разрешить путь от 16-битного до 21-битного Юникода.

Что бы вы ни слышали илидумаю, Unicode не был 16-битным кодом в течение самого долгого времени в своей истории, и в настоящее время нет ничего, что требовало бы 16-битного кодирования.Однако:

  1. Системы и среды, которые были очень ранними последователями Unicode, первоначально использовали UCS-2, просто потому, что это был простой способ поддержки всех символов из нового набора символов.Те перешли на UTF-16.Windows, Java и .NET (благодаря своему наследию Windows) являются примерами этого.
  2. В большинстве других мест в настоящее время используется UTF-8, который также является доминирующей кодировкой в ​​Интернете (согласно Google).UTF-8 не нуждается в суррогатных парах, но вместо этого использует другую схему, где кодовые точки представлены одной (ASCII), двумя, тремя или четырьмя кодовыми единицами (в зависимости от кодовой точки).
  3. Существует такжеUTF-32, идентичный UCS-4, использует четыре байта на символ.Это в основном используется для некоторых внутренних процессов программного обеспечения, где каждая кодовая точка должна иметь одинаковую длину.Он редко используется при хранении или обмене.
0 голосов
/ 08 марта 2012

Существуют разные кодировки для Unicode. И UTF-8, и UTF-16 используют один или несколько 8- или 16-битных двоичных объектов для представления одного символа в зависимости от любой кодовой точки Юникода.

wchar_t или 16-разрядное целое число, с другой стороны, может представлять только некоторые кодовые точки Юникода.

http://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings

о суррогатных парах:

http://msdn.microsoft.com/en-us/library/8k5611at.aspx http://www.unicode.org/faq/utf_bom.html#utf16-4

...