Поделиться через


Кодовые страницы и строки Юникода

Другой аспект реализации IPropertySetStorage заключается в том, как имена свойств Юникода хранятся в идентификаторе свойства 0 (словаре имен свойств), который не использует строки Юникода.

Юникод официально имеет значение кодовой страницы 1200. Чтобы сохранить значения Юникода в словаре имен свойств, используйте значение кодовой страницы 1200 для всего набора свойств (в идентификаторе свойства 1), указанное отсутствием флага PROPSETFLAG_ANSI в IPropertySetStorage::Create. Помните, что это имеет побочный эффект хранения всех строковых значений в наборе свойств в Юникоде. Во всех кодовых страницах счетчик, найденный в начале VT_LPSTR, является числом байтов, а не числом символов. Это необходимо для обеспечения совместимости с клиентами более ранней версии.

Реализация составного файла IPropertySetStorage создает все новые наборы свойств в Юникоде (кодовая страница 1200) или на текущей кодовой странице ANSI системы. Это управляется отсутствием или наличием флага PROPSETFLAG_ANSI в параметре grfFlags параметра IPropertySetStorage::Create.

Создание и открытие наборов свойств в виде Юникода. Для реализации этого не устанавливайте флаг PROPSETFLAG_ANSI в параметре grfFlags параметра IPropertySetStorage::Create. Избегайте использования VT_LPSTR значений и вместо этого используйте VT_LPWSTR значения. Если кодовая страница набора свойств является Юникодом, VT_LPSTR строковые значения преобразуются в Юникод при хранении, а затем возвращаются в многобайтовые строковые значения при извлечении.

Задание флага PROPSETFLAG_ANSI, как сообщается через вызов IPropertyStorage::Stat отражает, является ли базовая кодовая страница или не юникод. Помните, что идентификатор свойства 1 можно явно прочитать, чтобы узнать кодовую страницу.

Вы можете получить доступ к идентификатору свойства 1 через вызов IPropertyStorage::ReadMultiple. Однако он доступен только для чтения и может не обновляться с помощью WriteMultiple. Кроме того, его нельзя удалить с помощью DeleteMultiple.