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

时间:2016-03-07 21:12:41

标签: c++ string winapi lpcstr 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的常量以null结尾的字符串的指针   (ANSI)字符。有关更多信息,请参阅使用的字符集   字体。

     

此类型在WinNT.h中声明如下:

     

typedef CONST CHAR * PCSTR;

和LPCWSTR:

  

指向16位Unicode的常量以null结尾的字符串的指针   字符。有关更多信息,请参阅字体使用的字符集。

     

此类型在WinNT.h中声明如下:

     

typedef CONST WCHAR * LPCWSTR;

我没有找到从这两种数据类型转换的方法。我尝试将标题转换为 char * ,然后使用下面的函数从 char * 转移到 LPCWSTR :< / p>

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 个答案:

答案 0 :(得分:2)

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

返回PCSTR数据类型。

     

但我需要将标题作为WriteEventViewerLog提供   LPCWSTR,因为我在方法中使用了其中一个函数   只接受该格式的字符串。

首先,让我们澄清这些&#34;模糊&#34;的含义。 Windows API字符串typedef s:

PCSTR:   const char *    
LPCWSTR: const wchar_t *

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

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

char - 基于字符串可以是多个&#34;表格&#34; (或编码),例如简单 ASCII ,或 Unicode UTF-8 ,或其他&#34;多字节&#34;编码。

如果是你的标题字符串,我认为它可以是简单的ASCII或UTF-8(注意ASCII是UTF-8的正确子集)。

Visual C ++中基于

wchar_t的字符串是 Unicode UTF-16 字符串(这是大多数Win32 API使用的&#34; native&#34; Unicode编码)。< / p>

因此,您需要做的是将基于char的字符串转换为基于wchar_t的字符串。假设基于char的字符串表示 Unicode UTF-8 字符串(纯ASCII是正确的子集),您可以使用MultiByteToWideChar() Win32 API来执行转换。

或者您可以使用一些辅助类来简化转换任务,例如ATL conversion helpers。特别是,带有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) );