visualc&x2B+;:将数据类型PCSTR转换为LPCWSTR 我有以下C++代码,从HtpCurrar实例检索标题请求信息: 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);

visualc&x2B+;:将数据类型PCSTR转换为LPCWSTR 我有以下C++代码,从HtpCurrar实例检索标题请求信息: 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);,c++,string,winapi,lpcstr,lpcwstr,C++,String,Winapi,Lpcstr,Lpcwstr,如您所见,电话: pHttpContext->GetRequest()->GetHeader("Accept", NULL)** 返回PCSTR数据类型 但是我需要将头作为“LPCWSTR”提供给WriteEventViewLog,因为我在方法中使用的函数之一只接受该格式的字符串 从,关于以下字符串定义: 指向以常量null结尾的8位窗口字符串的指针 (ANSI)字符。有关详细信息,请参见使用的字符集 字体 该类型在WinNT.h中声明如下: typedef CONST CHAR

如您所见,电话:

pHttpContext->GetRequest()->GetHeader("Accept", NULL)** 
返回PCSTR数据类型

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

从,关于以下字符串定义:

指向以常量null结尾的8位窗口字符串的指针 (ANSI)字符。有关详细信息,请参见使用的字符集 字体

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

typedef CONST CHAR*PCSTR

和LPCWSTR:

指向以null结尾的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”)

返回
PCSTR
数据类型

但是我需要将头作为一个
LPCWSTR
,因为我在方法中使用的函数之一 仅接受该格式的字符串

首先,让我们澄清这些“模糊”的Windows API字符串
typedef
s的含义:

PCSTR:   const char *    
LPCWSTR: const wchar_t *
因此,它们都是指向只读NUL终止的C样式字符串的指针

不同之处在于,
PCSTR
指向基于
char
的字符串
LPCWSTR
指向基于
wchar\u t
的字符串

基于字符的字符串可以有几种“形式”(或编码),例如简单的
ASCII,或Unicode UTF-8,或其他“多字节”编码

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

<强> > Unicode UTF 16<:强>字符串(这是大多数Win32 API使用的“原生”Unicode编码)。

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

或者,您可以使用一些帮助器类来简化转换任务,例如。特别是,带有
CP\u 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) );
#包括//用于CA2W
...
//获取Unicode UTF-8格式的头字符串
PCSTR header=pHttpContext->GetRequest()->GetHeader(“接受”,nullptr);
//将头字符串从UTF-8转换为Unicode UTF-16
写入EventViewerLog(CA2W(标题,CP_UTF8));

该功能应该可以工作。检查调试器中发生的情况。从外观上看,
chararlytolpwstr()
应该可以工作,尽管我会使其
const char*source
PCSTR
的类型匹配:
LPWSTR wszHeader=chararlytolpwstr(header);/*使用wszHeader的代码。*/删除[]wszHeader。您是否有更多信息,例如示例输入和输出有效或无效,以及可能需要使用
LPWSTR
的实际代码部分?请尝试
CP\u UTF8
而不是
CP\u ACP
我建议在
MultiByteToWideChar()
周围使用方便的ATL转换帮助程序,或者编写一些函数,返回
CString
std::wstring
,但不要返回在函数体中分配了
new[]
的原始指针。如果调用方不太注意释放返回的字符串,则这可能是泄漏。它是C++,而不是C。函数不检查返回值。请举例说明导致不良输出的输入。还要注意,该函数要求调用方正确释放缓冲区,否则缓冲区将泄漏。使用CA2W解决了这个问题。除了atlconv.h之外,我还必须
#include#include
,才能使用它。
#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) );