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的适当子集)
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) );