Visual C++:将数据类型 PCSTR 转换为 LPCWSTR
Visual C++: Convert data type PCSTR to LPCWSTR
我有以下从 HttpContext 实例检索 header 请求信息的 C++ 代码:
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)**
Returns PCSTR 数据类型。
但我需要将 header 作为 "LPCWSTR" 提供给 WriteEventViewerLog,因为我在方法中使用的函数之一只接受该格式的字符串。
来自https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx,关于这些字符串定义:
A pointer to a constant null-terminated string of 8-bit Windows
(ANSI) characters. For more information, see Character Sets Used By
Fonts.
This type is declared in WinNT.h as follows:
typedef CONST CHAR *PCSTR;
和 LPCWSTR:
A pointer to a constant null-terminated string of 16-bit Unicode
characters. For more information, see Character Sets Used By Fonts.
This type is declared in WinNT.h as follows:
typedef CONST WCHAR *LPCWSTR;
我没有找到从这两种数据类型转换的方法。我尝试将 header 转换为 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;
}
但是这返回给我一个无效的字符串(我没有完整的输入,但是接受 header 值被修剪为 "x;ih")。
pHttpContext->GetRequest()->GetHeader("Accept", NULL);
returns a PCSTR
data type.
But I need to feed the WriteEventViewerLog
with header as a
LPCWSTR
, since one of the functions that I use inside the methods
only accepts the string in that format.
首先要弄清楚这些"obscure"WindowsAPI字符串的含义typedef
s:
PCSTR: const char *
LPCWSTR: const wchar_t *
因此,两者都是 指向 read-only NUL-terminated C-style 字符串的指针。
区别在于PCSTR
指向一个基于char
的字符串; LPCWSTR
指向基于 wchar_t
的字符串。
基于char
的字符串可以是几个"forms"(或编码),例如简单 ASCII,或 Unicode UTF-8,或其他 "multi-byte" 编码。
如果是您的 header 字符串,我假设它可以是简单的 ASCII 或 UTF-8(注意 ASCII 是 UTF-8 的真子集)。
Visual C++ 中基于 wchar_t
的字符串是 Unicode UTF-16 字符串(这是大多数 Win32 使用的 "native" Unicode 编码 APIs).
因此,您要做的是将基于 char
的字符串转换为基于 wchar_t
的字符串。假设您的基于 char
的字符串表示一个 Unicode UTF-8 字符串(其中纯 ASCII 是一个适当的子集),您可以使用 MultiByteToWideChar()
Win32 API 进行转换。
或者您可以使用一些助手 类 来 简化 转换任务,例如 ATL conversion helpers。特别是,带有 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) );
我有以下从 HttpContext 实例检索 header 请求信息的 C++ 代码:
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)**
Returns PCSTR 数据类型。
但我需要将 header 作为 "LPCWSTR" 提供给 WriteEventViewerLog,因为我在方法中使用的函数之一只接受该格式的字符串。
来自https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx,关于这些字符串定义:
A pointer to a constant null-terminated string of 8-bit Windows (ANSI) characters. For more information, see Character Sets Used By Fonts.
This type is declared in WinNT.h as follows:
typedef CONST CHAR *PCSTR;
和 LPCWSTR:
A pointer to a constant null-terminated string of 16-bit Unicode characters. For more information, see Character Sets Used By Fonts.
This type is declared in WinNT.h as follows:
typedef CONST WCHAR *LPCWSTR;
我没有找到从这两种数据类型转换的方法。我尝试将 header 转换为 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;
}
但是这返回给我一个无效的字符串(我没有完整的输入,但是接受 header 值被修剪为 "x;ih")。
pHttpContext->GetRequest()->GetHeader("Accept", NULL);
returns a
PCSTR
data type.But I need to feed the
WriteEventViewerLog
with header as aLPCWSTR
, since one of the functions that I use inside the methods only accepts the string in that format.
首先要弄清楚这些"obscure"WindowsAPI字符串的含义typedef
s:
PCSTR: const char *
LPCWSTR: const wchar_t *
因此,两者都是 指向 read-only NUL-terminated C-style 字符串的指针。
区别在于PCSTR
指向一个基于char
的字符串; LPCWSTR
指向基于 wchar_t
的字符串。
char
的字符串可以是几个"forms"(或编码),例如简单 ASCII,或 Unicode UTF-8,或其他 "multi-byte" 编码。
如果是您的 header 字符串,我假设它可以是简单的 ASCII 或 UTF-8(注意 ASCII 是 UTF-8 的真子集)。
Visual C++ 中基于wchar_t
的字符串是 Unicode UTF-16 字符串(这是大多数 Win32 使用的 "native" Unicode 编码 APIs).
因此,您要做的是将基于 char
的字符串转换为基于 wchar_t
的字符串。假设您的基于 char
的字符串表示一个 Unicode UTF-8 字符串(其中纯 ASCII 是一个适当的子集),您可以使用 MultiByteToWideChar()
Win32 API 进行转换。
或者您可以使用一些助手 类 来 简化 转换任务,例如 ATL conversion helpers。特别是,带有 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) );