Могут ли символы BSTR содержать более 16 бит для представления? - PullRequest
3 голосов
/ 17 декабря 2009

Я запутался в Windows BSTR, WCHAR и т. Д. WCHAR - это 16-разрядный символ, предназначенный для символов Юникода. А как насчет символов, для представления которых требуется более 16 бит? Некоторые символы UTF-8 требуют большего, чем это. Это ограничение Windows?

Редактировать: Спасибо за все ответы. Я думаю, что я понимаю аспект Unicode. Я все еще запутался в аспекте Windows / WCHAR. Если WCHAR является 16-битным символом, действительно ли Windows использует 2 из них для представления кодовых точек, больших 16-битных, или данные усечены?

Ответы [ 6 ]

5 голосов
/ 17 декабря 2009

UTF-8 не является кодировкой, используемой в типах Windows BSTR или WCHAR. Вместо этого они используют UTF-16, который определяет каждую кодовую точку в наборе Unicode, используя 1 или 2 WCHAR. 2 WCHAR дают точно такое же количество кодовых точек, что и 4 байта UTF-8.

Таким образом, нет никаких ограничений в обработке набора символов Windows.

2 голосов
/ 17 декабря 2009

UTF8 - это кодировка символа Unicode (кодовая точка). Вы можете прочитать этот превосходный ответ на эту тему. Чтобы ответить на ваш вопрос, BSTR всегда кодируются как UTF-16. Если у вас есть строки в кодировке UTF-32, вам придется сначала их перекодировать.

1 голос
/ 17 декабря 2009

BSTR просто содержит 16 битовых кодовых единиц, которые могут содержать любые данные в кодировке UTF-16. Что касается ОС, Windows поддерживает суррогатные пары начиная с XP. См. Dr International FAQ

1 голос
/ 17 декабря 2009

Как уже упоминалось, в FAQ есть много полезной информации о юникоде.

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

1 голос
/ 17 декабря 2009

Стандарт Unicode определяет где-то более миллиона уникальных кодовых точек (каждая кодовая точка представляет собой «абстрактный» символ или символ - например, «E», «=» или «~»).

Стандарт также определяет несколько методов кодирования этих миллионов кодовых точек в обычно используемые базовые типы данных, такие как 8-битные символы или 16-байтовые символы.

Двумя наиболее широко используемыми кодировками являются utf-8 и utf-16. utf-8 определяет, как кодировать кодовые точки Unicode в 8-битные символы. Каждая кодовая точка Unicode будет отображать от 1 до 4 8-битных символов.

utf-16 определяет, как кодировать кодовые точки Unicode в 16-битные слова (WCHAR в Windows). Большинство кодовых точек отображаются на один 16-битный WCHAR, но есть некоторые, для представления которых требуется два WCHAR.

Я рекомендую взглянуть на стандарт Unicode и особенно FAQ (http://unicode.org/faq/utf_bom.html)

0 голосов
/ 17 декабря 2009

Windows использовала UTF-16 в качестве своего собственного представления начиная с Windows 2000; до этого он использовал UCS-2. UTF-16 поддерживает любой символ Unicode; UCS-2 поддерживает только BMP. то есть это будет делать правильно.

В общем, в любом случае, это не имеет большого значения. Для большинства приложений строки довольно непрозрачны и просто передаются какому-то механизму ввода / вывода (для хранения в файле или базе данных, или для отображения на экране и т. Д.), Который будет действовать правильно. Вам просто нужно убедиться, что вы не повредите струны вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...