строка — Visual C ++: преобразовать тип данных PCSTR в LPCWSTR

У меня есть следующий код 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»).

1

Решение

pHttpContext->GetRequest()->GetHeader("Accept", NULL);

возвращает PCSTR тип данных.

Но мне нужно кормить WriteEventViewerLog с заголовком в виде
LPCWSTR, так как одна из функций, которые я использую внутри методов
принимает только строку в этом формате.

Во-первых, давайте проясним значение этих «неясных» строк Windows API typedefs:

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) );
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]