[英]Visual C++: Convert data type PCSTR to 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/zh-cn/library/windows/desktop/aa383751%28v=vs.85%29.aspx中 ,有关以下字符串定义:
指向以8位Windows(ANSI)字符组成的恒定的,以空字符结尾的字符串的指针。 有关更多信息,请参见字体使用的字符集。
在WinNT.h中声明此类型,如下所示:
typedef CONST CHAR * PCSTR;
和LPCWSTR:
指向以16位Unicode字符为常数的,以空字符终止的常量的指针。 有关更多信息,请参见字体使用的字符集。
在WinNT.h中声明此类型,如下所示:
typedef CONST WCHAR * LPCWSTR;
我没有找到从这两种数据类型转换的方法。 我尝试将标头转换为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”)。
pHttpContext->GetRequest()->GetHeader("Accept", NULL);
返回
PCSTR
数据类型。但是我需要使用Header作为
LPCWSTR
来提供WriteEventViewerLog
,因为我在方法内部使用的功能之一仅接受该格式的字符串。
首先,让我们澄清一下这些“晦涩”的Windows API字符串typedef
的含义:
PCSTR: const char *
LPCWSTR: const wchar_t *
因此,它们都是指向NUL终止的只读C样式字符串的指针 。
不同之处在于PCSTR
指向基于char
的字符串; LPCWSTR
指向基于wchar_t
的字符串。
基于char
的字符串可以具有几种“形式” (或编码 ),例如简单ASCII或Unicode UTF-8或其他“多字节”编码。
对于您的标头字符串,我假设它可以是简单的ASCII或UTF-8(请注意ASCII是UTF-8的适当子集)。
Visual C ++中基于wchar_t
的字符串是Unicode UTF-16字符串(这是大多数Win32 API使用的“本机” Unicode编码)。
因此,您要做的是将基于char
的字符串转换为基于wchar_t
的字符串。 假设基于char
的字符串表示Unicode UTF-8字符串(纯ASCII是其适当的子集),则可以使用MultiByteToWideChar()
Win32 API进行转换。
或者,您可以使用一些帮助程序类来简化转换任务,例如ATL转换帮助程序 。 特别是,带有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) );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.