簡體   English   中英

Visual C ++:將數據類型PCSTR轉換為LPCWSTR

[英]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的字符串可以具有幾種“形式” (或編碼 ),例如簡單ASCIIUnicode 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM