У меня есть следующий код C ++, который получает информацию запроса заголовка из экземпляра HttpContext:
public:
REQUEST_NOTIFICATION_STATUS
OnBeginRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER(pHttpContext);
UNREFERENCED_PARAMETER(pProvider);
PCSTR header = pHttpContext->GetRequest()->GetHeader("Accept", NULL);
WriteEventViewerLog(header);
Как видите, звонок:
pHttpContext->GetRequest()->GetHeader("Accept", NULL)**
Возвращает тип данных PCSTR.
Но мне нужно передать WriteEventViewerLog с заголовком как «LPCWSTR», поскольку одна из функций, которые я использую внутри методов, принимает только строку в этом формате.
От https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx, об этих определениях строк:
Указатель на постоянную строку с нулевым символом в конце 8-битной Windows
(ANSI) символы. Для получения дополнительной информации см. Наборы символов, используемые
Шрифты.Этот тип объявлен в WinNT.h следующим образом:
typedef CONST CHAR * PCSTR;
И LPCWSTR:
Указатель на константную строку с нулевым символом в конце 16-битного Unicode
персонажи. Для получения дополнительной информации см. Наборы символов, используемые шрифтами.Этот тип объявлен в WinNT.h следующим образом:
typedef CONST WCHAR * LPCWSTR;
Я не нашел способ преобразования из этих двух типов данных. Я пробовал кастинг заголовок в символ * а затем с помощью функции ниже, чтобы перейти от символ * в LPCWSTR:
LPWSTR charArrayToLPWSTR(char *source)
{
// Get required buffer size in 'wide characters'
int nSize = MultiByteToWideChar(CP_ACP, 0, source, -1, NULL, 0);
LPWSTR outString = new WCHAR[nSize];
// Make conversion
MultiByteToWideChar(CP_ACP, 0, source, -1, outString, nSize);
return outString;
}
Но это вернуло мне неверную строку (у меня нет полного ввода, но значение заголовка Accept было обрезано до «x; ih»).
pHttpContext->GetRequest()->GetHeader("Accept", NULL);
возвращает
PCSTR
тип данных.Но мне нужно кормить
WriteEventViewerLog
с заголовком в виде
LPCWSTR
, так как одна из функций, которые я использую внутри методов
принимает только строку в этом формате.
Во-первых, давайте проясним значение этих «неясных» строк Windows API typedef
s:
PCSTR: const char *
LPCWSTR: const wchar_t *
Итак, оба указатели на строки, доступные только для чтения, в NUL-стиле.
Разница в том, что PCSTR
указывает на char
строка на основе; LPCWSTR
указывает на wchar_t
на основе строки.
char
строки могут быть нескольких «форма» (или же кодировок), например просто ASCII, или же Юникод UTF-8, или другие «многобайтовые» кодировки.
В случае вашей строки заголовка, я предполагаю, что это может быть простой ASCII или UTF-8 (обратите внимание, что ASCII является правильным подмножеством UTF-8).
wchar_t
строки в Visual C ++ Юникод UTF-16 строки (и это «родная» кодировка Unicode, используемая большинством Win32 API).
Итак, что вам нужно сделать, это преобразовать из char
на основе строки к wchar_t
на основе. Предполагая, что ваш char
Строка на основе представляет Юникод UTF-8 Строка (из которых чистый ASCII является правильным подмножеством), вы можете использовать MultiByteToWideChar()
Win32 API для преобразования.
Или вы можете использовать некоторые вспомогательные классы для упростить задача преобразования, например Помощники преобразования ATL. В частности, CA2W
помощник с CP_UTF8
Флаг преобразования может пригодиться в вашем случае:
#include <atlconv.h> // for CA2W
...
// Get the header string in Unicode UTF-8
PCSTR header = pHttpContext->GetRequest()->GetHeader("Accept", nullptr);
// Convert the header string from UTF-8 to Unicode UTF-16
WriteEventViewerLog( CA2W(header, CP_UTF8) );
Других решений пока нет …