Как UCS-2 отображает кодовые точки Unicode, которые занимают 6 байтов в UTF-8?

Я читал об Unicode на http://www.joelonsoftware.com/articles/Unicode.html. Джоэл говорит, что UCS-2 кодирует все символы Unicode в 2 байта, тогда как UTF-8 может занять до 6 байтов для кодирования некоторых символов Unicode. Не могли бы вы объяснить на примере, как 6-байтовый кодированный в кодировке UTF-8 код Unicode кодируется в UCS-2?

2 ответа

Решение

UCS-2 был создан, когда Unicode имел менее 65536 кодовых точек, поэтому все они вмещались максимум в 2 байта. Как только Unicode вырос до более чем 65536 кодовых точек, UCS-2 устарел и был заменен на UTF-16, который кодирует все UCS-2-совместимые кодовые точки, используя 2 байта, а остальные - 4 байта через суррогатные пары.

UTF-8 изначально был написан для кодирования кодовых точек длиной до 6 байтов (U+7FFFFFFF max), но позже был ограничен 4 байтами (U+1FFFFF max, хотя все, что выше U + 10FFFF запрещено), так что он на 100% совместим с UTF -16 туда-сюда и не кодирует никакие кодовые точки, которые не поддерживает UTF-16. Максимальная кодовая точка, которую поддерживают как UTF-8, так и UTF-16, составляет U + 10FFFF.

Таким образом, чтобы ответить на ваш вопрос, кодовая точка, для которой требуется 5- или 6-байтовая последовательность UTF-8 (от U+200000 до U+7FFFFFFF), не может быть закодирована в UCS-2 или даже в UTF-16. Недостаточно доступных битов для хранения таких больших значений кодовой точки.

UCS-2 хранит все, что может, в двух байтах и ​​ничего не делает с кодами, которые не помещаются в это пространство. Вот почему UCS-2 сегодня практически бесполезен.

Вместо этого у нас есть UTF-16, который выглядит как UCS-2 для всех двухбайтовых последовательностей, но также допускает суррогатные пары, пары двухбайтовых последовательностей. Используя их, оставшиеся кодовые точки можно кодировать, используя в общей сложности 4 байта.

Другие вопросы по тегам