Статус: Активный участник
Группы: Участники
Зарегистрирован: 14.03.2011(UTC) Сообщений: 152 Откуда: Санкт-Петербург Сказал «Спасибо»: 1 раз Поблагодарили: 7 раз в 5 постах
|
Просвятите, пожалуйста.
Рассмотрим документацию функции CryptFindOIDInfo. Скажем так, пожадничали в описании. Есть ссылка на MSDN документацию к этой функции.
Читаем: для dwKeyType = CRYPT_OID_INFO_OID_KEY pvKey is the address of a null-terminated ANSI string that contains the OID string to find.
Но у нас ведь современная Linux, где для консоли выставлена UTF-8, а не какая то KOI-8R. То есть, "ANSI string" надо читать как UTF-8 - C++11 u8"OID.XXX.XXX.XXX..." ?
Читаем дальше: для dwKeyType = CRYPT_OID_INFO_NAME_KEY pvKey is the address of a null-terminated Unicode string that contains the name to find.
Unicode? Какой такой Unicode UTF-16 - C++11 u"OID.XXX.XXX.XXX..." ? (wchar_t for Windows, 2 bytes) UTF-32 - C++11 U"OID.XXX.XXX.XXX..." ? (wchar_t for Linux, 4 bytes)
mbstowcs (#include <stdlib.h>) - это UTF-8 в wchar_t или UTF-16 в wchar_t ? (Linux wchar_t === UTF-32)
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
Это же ведь MS API, им на "современный Linux" как то все равно... Поэтому ANSI это не UTF-8.
Насчет Unicode - это wchar_t. И для win и для Linux он разный. И разный ожидается в разных платформах. Для бинарной совместимости как либо блобов надо конвертировать их в платформозависимый вид.
насчет mbstowcs - The behavior of mbstowcs() depends on the LC_CTYPE category of the current locale. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 14.03.2011(UTC) Сообщений: 152 Откуда: Санкт-Петербург Сказал «Спасибо»: 1 раз Поблагодарили: 7 раз в 5 постах
|
Хочу еще раз помучить. Функция CertGetNameString. Точнее, это псевдоним для двух функций CertGetNameStringA и CertGetNameStringW. В документации MSDN написано Цитата:Returns the number of characters converted, including the terminating zero character. Для CertGetNameStringW все более менее ясно для wchar_t (char32_t). Но совсем туманно становится для Windows wchar_t (char16_t). Рассмотрим базовый пример из документации к функции mbstowcs Код:
std::setlocale(LC_ALL, "en_US.utf8");
const char* mbstr = u8"z\u00df\u6c34\U0001d10b";
В строке 4 буквы, плюс NULL терминатор. Итого, 5 букв. Я почему то ожидаю, что под Linux вернет 5, а под Windows 6. Функцией CertGetNameStringA вообще, страшно пользоваться. Что на самом деле вернет функция CertGetNameStringW ?
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close