Visual C++:将数据类型 PCSTR 转换为 LPCWSTR

Visual C++: Convert data type PCSTR to LPCWSTR

我有以下从 HttpContext 实例检索 header 请求信息的 C++ 代码:

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)** 

Returns PCSTR 数据类型。

但我需要将 header 作为 "LPCWSTR" 提供给 WriteEventViewerLog,因为我在方法中使用的函数之一只接受该格式的字符串。

来自https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx,关于这些字符串定义:

A pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef CONST CHAR *PCSTR;

和 LPCWSTR:

A pointer to a constant null-terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts.

This type is declared in WinNT.h as follows:

typedef CONST 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;
    }

但是这返回给我一个无效的字符串(我没有完整的输入,但是接受 header 值被修剪为 "x;ih")。

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

returns a PCSTR data type.

But I need to feed the WriteEventViewerLog with header as a LPCWSTR, since one of the functions that I use inside the methods only accepts the string in that format.

首先要弄清楚这些"obscure"WindowsAPI字符串的含义typedefs:

PCSTR:   const char *    
LPCWSTR: const wchar_t *

因此,两者都是 指向 read-only NUL-terminated C-style 字符串的指针

区别在于PCSTR指向一个基于char的字符串; LPCWSTR 指向基于 wchar_t 的字符串。

基于

char的字符串可以是几个"forms"(或编码),例如简单 ASCII,或 Unicode UTF-8,或其他 "multi-byte" 编码。

如果是您的 header 字符串,我假设它可以是简单的 ASCII 或 UTF-8(注意 ASCII 是 UTF-8 的真子集)。

Visual C++ 中基于

wchar_t 的字符串是 Unicode UTF-16 字符串(这是大多数 Win32 使用的 "native" Unicode 编码 APIs).

因此,您要做的是将基于 char 的字符串转换为基于 wchar_t 的字符串。假设您的基于 char 的字符串表示一个 Unicode UTF-8 字符串(其中纯 ASCII 是一个适当的子集),您可以使用 MultiByteToWideChar() Win32 API 进行转换。

或者您可以使用一些助手 类 来 简化 转换任务,例如 ATL conversion helpers。特别是,带有 CP_UTF8 转换标志的 CA2W 助手在您的情况下可以派上用场:

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