Всегда ли символы UTF16 (используемые, например, функциями wide-winapi) 2 байта?

Пожалуйста, поясните мне, как работает UTF16? Я немного сбит с толку, учитывая следующие моменты:

  • В C ++ существует статический тип WCHAR, длина которого составляет 2 байта. (очевидно, всегда 2 байта)
  • Большая часть msdn и некоторой другой документации, похоже, предполагает, что символы всегда имеют длину 2 байта. Это может быть просто мое воображение, я не могу придумать никаких конкретных примеров, но это просто так кажется.
  • Не существует "сверхшироких" функций или типов символов, широко используемых в C ++ или Windows, поэтому я предполагаю что UTF16 - это все, что когда-либо было необходимо.
  • Насколько мне известно, в Unicode намного больше символов, чем 65535, поэтому в них явно не хватает места в 2 байтах.
  • UTF16, похоже, является более крупной версией Символы UTF8 и UTF8 могут иметь разную длину.

Итак, если символ UTF16 не всегда имеет длину 2 байта, как долго еще это могло быть? 3 байта? или только кратные 2? А затем, например, если есть функция winapi, которая хочет знать размер широкой строки в символах, и строка содержит 2 символа, каждый из которых имеет длину 4 байта, каков размер этой строки в символах рассчитано?

Это 2 символа или 4 символа? (поскольку он имеет длину 8 байтов, а каждый WCHAR - 2 байта)

ОБНОВЛЕНИЕ: теперь я вижу, что подсчет символов не обязательно является стандартным или даже частью C ++, поэтому я постараюсь быть немного больше конкретно в моем втором вопросе о длине «символов» широкой строки:

В Windows, в частности, в Winapi, в их широких функциях (заканчивающихся на W), как подсчитать количество символов в строке который состоит из 2 кодовых точек Unicode, каждый состоит из 2 кодовых единиц (всего 8 байтов)? Является ли такая строка длиной 2 символа (такой же, как количество кодовых точек) или длиной 4 символа (такой же, как общее количество кодовых единиц?)

Или, говоря более общим образом: что Windows определяет «количество символов в широкая строка "означает, количество кодовых точек или количество кодовых единиц?

5
задан Cray 11 January 2011 в 00:53
поделиться