1

我有以下 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 常量 WCHAR *LPCWSTR;

我没有找到从这两种数据类型转换的方法。我尝试将header转换为char*,然后使用下面的函数从char*移动到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”)。

4

1 回答 1

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

返回一个PCSTR数据类型。

但是我需要将WriteEventViewerLogwith 标头作为 a 提供 LPCWSTR,因为我在方法中使用的函数之一只接受该格式的字符串。

首先,让我们澄清一下这些“晦涩”的 Windows API 字符串typedef的含义:

PCSTR:   const char *    
LPCWSTR: const wchar_t *

因此,两者都是指向只读 NUL 终止的 C 样式字符串的指针。

不同之处在于PCSTR指向char基于 - 的字符串;LPCWSTR指向wchar_t基于 - 的字符串。

char基于 - 的字符串可以是多种“形式”(或编码),例如简单的ASCIIUnicode UTF-8或其他“多字节”编码。

对于您的标头字符串,我假设它可以是简单的 ASCII 或 UTF-8(请注意,ASCII 是 UTF-8 的正确子集)。

wchar_tVisual C++ 中基于 - 的字符串是Unicode UTF-16字符串(这是大多数 Win32 API 使用的“本机”Unicode 编码)。

因此,您要做的就是从char基于 - 的字符串转换为基于 - 的字符串wchar_t。假设您char的基于 - 的字符串表示一个Unicode 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) );
于 2016-03-07T23:24:08.370 回答