如何从 LPWSTR 转换为 'const char*'

how to convert from LPWSTR to 'const char*'

本文关键字:char const LPWSTR 转换      更新时间:2023-10-16

使用C++/CLI:从C#到C++获取结构后

public value struct SampleObject
{   
    LPWSTR a;    
};

我想打印它的实例:

printf(sampleObject->a);

但我得到了这个错误:

错误1错误C2664:"printf":无法从转换参数1"LPWSTR"到"const char*"

如何从LPWSTR to char*转换?

提前谢谢。

使用位于<stdlib.h>中的wcstombs()函数。以下是使用方法:

LPWSTR wideStr = L"Some message";
char buffer[500];
// First arg is the pointer to destination char, second arg is
// the pointer to source wchar_t, last arg is the size of char buffer
wcstombs(buffer, wideStr, 500);
printf("%s", buffer);

希望这能帮助到别人!这个功能使我免于很多挫折。

只需使用printf("%ls", sampleObject->a)。在%ls中使用l意味着您可以传递wchar_t[],例如L"Wide String"

(不,我不知道为什么L和w前缀总是混合在一起)

int length = WideCharToMultiByte(cp, 0, sampleObject->a, -1, 0, 0, NULL, NULL);
char* output = new char[length];
WideCharToMultiByte(cp, 0, sampleObject->a, -1, output , length, NULL, NULL);
printf(output);
delete[] output;

使用WideCharToMultiByte()方法转换多字节字符。

以下是从LPWSTR转换为char的示例*或宽字符对字符

/*LPWSTR to char* example.c */
#include <stdio.h>
#include <windows.h>
void LPWSTR_2_CHAR(LPWSTR,LPSTR,size_t);
int main(void)
{   
    wchar_t w_char_str[] = {L"This is wide character string test!"};
    size_t w_len = wcslen(w_char_str);
    char char_str[w_len + 1];
    memset(char_str,'',w_len * sizeof(char));
    LPWSTR_2_CHAR(w_char_str,char_str,w_len);
    puts(char_str);
    return 0;
}
void LPWSTR_2_CHAR(LPWSTR in_char,LPSTR out_char,size_t str_len)
{   
    WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,in_char,-1,out_char,str_len,NULL,NULL);
}

这里有一个简单的解决方案。检查wsprintf

LPWSTR wideStr = "some text";
char* resultStr = new char [wcslen(wideStr) + 1];
wsprintfA ( resultStr, "%S", wideStr);

"%S"将隐式地将UNICODE转换为ANSI。

不要转换。

使用wprintf而不是printf:

  • wprintf

请参阅解释如何使用它的示例。

或者,您可以将std::wcout用作:

wchar_t *wstr1= L"string";
LPWSTR   wstr2= L"string"; //same as above
std::wcout << wstr1 << L", " << wstr2;

类似地,使用为宽字符设计的函数,忘记将wchar_t转换为char的想法,因为这可能会丢失数据。

看看这里处理宽字符的函数:

  • Visual C中的Unicode++