我有以下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”)。
答案 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) );