Какая самая большая кодовая точка для 16-битного типа wchar_t?

Здесь сказано, что самая большая кодовая точка UTF-16 10FFFF

Также на этой странице написано, что

Для символов BMP требуется одна 16-битная единица кода для обработки или хранения.

Но в битовом представлении 10FFFF является

0001 0000   1111 1111   1111 1111

Мы видим, что он занимает более 15 бит из 16 бит wchar_t (реализация может поддерживать только широкие символы со значением>=0, независимо от подписи wchar_t)

Какая самая большая кодовая точка для 16-битного кода? wchar_t?

1 ответ

Решение

Здесь сказано, что самая большая кодовая точка UTF-16- 10FFFF

Да, но вы неверно истолковываете таблицу, из которой вы рисуете.

U + 10FFFF является наибольшим значением кодовой точки Unicode. UTF-16- это не сам Unicode, это кодировка кодовых точек Unicode с использованием 16-битных кодовых единиц (так же, как UTF-8 является кодированием с использованием 8-битных кодовых единиц) . Как вы отметили, 16 битов недостаточно для представления всего диапазона значений кодовой точки Unicode. Кодирование UTF-16 кодовых точек Unicode U+0000 - U+FFFF требует только 1 кодовой единицы, но кодирование кодовых точек U+10000 - U+10FFFF требует 2 кодовых единиц, действующих вместе, известных как "суррогатная пара". UTF-16 является преемником UCS-2, который был исходной 16-битной кодировкой для Unicode, но он мог кодировать только кодовые точки U+0000 - U+FFFF. UTF-16 обратно совместим с UCS-2, но добавление суррогатных пар позволяет UTF-16 поддерживать весь диапазон кодовых точек Unicode.

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

Обратите также внимание на то, что для реализации на языке C использование UTF-16 (или UTF-8) в качестве "набора символов" является небольшим, хотя и распространенным, злоупотреблением, так как их кодовые единицы не все соответствуют 1–1 символам Unicode., Или, по крайней мере, символы, которым они соответствуют, должны интерпретироваться как единицы кода, которыми они являются. Это прагматичный подход к проблеме эффективного представления персонажей из большого диапазона.

Также на этой странице написано, что

Для символов BMP требуется одна 16-битная единица кода для обработки или хранения.

Это тоже правда. Вы, очевидно, упустили из виду тот факт, что символы BMP (базовая многоязычная плоскость, кодовые точки U+0000 - U+FFFF) являются подмножеством всех символов Unicode. 1/17 из них, на самом деле или несколько меньше, в зависимости от того, как вы считаете. Тот факт, что все значения их кодовых точек могут быть представлены 16 битами (т.е. в одной кодовой единице UTF-16), фактически может быть принят за определение этого подмножества.

Мы видим, что он занимает более 15 бит 16-битного wchar_t (реализация может поддерживать широкие символы только со значением>=0, независимо от подписи wchar_t)

Нет, как мы уже говорили в моем ответе на один из ваших недавних вопросов. Стандарт не накладывает никаких ограничений на реализации C для поддержки только неотрицательных значений кодовой точки. Это просто фактическое состояние назначений кодовых точек всех текущих, широко используемых наборов кодированных символов. Соответствующая реализация C, на которой wchar_t Подписано может обеспечить набор символов, в котором некоторые расширенные символы имеют отрицательный, соответствующий wchar_t ценности.

Какая самая большая кодовая точка для 16-битного wchar_t?

Это не имеет ничего общего с любым из вышеизложенного. На самом деле, это не имеет особого смысла. Значения кодовой точки являются характеристикой (кодированных) наборов символов, а не какого-либо типа данных C. Это числа, соответствующие символам, поддерживаемым этим набором.

Если реализация C утверждает, что предоставляет UTF-16 в качестве поддерживаемого набора символов, то из этого следует, что его wchar_t должен иметь как минимум 16 битов значения, поскольку этот тип должен быть способен представлять все значения кодовых единиц UTF-16. Если этот тип имеет всего 16 битов, то все они должны быть битами значения, что делает тип обязательно неподписанным и способным поддерживать значения до 0xFFFF,

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