如何转换LPWSTR到'const char *'

时间:2012-03-23 13:23:11

标签: c++ c++-cli

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

public value struct SampleObject
{   
    LPWSTR a;    
};

我想打印它的实例:

printf(sampleObject->a);

但是我收到了这个错误:

  

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

如何转换LPWSTR to char*

提前致谢。

6 个答案:

答案 0 :(得分:18)

使用wcstombs()功能,该功能位于<stdlib.h>。以下是如何使用它:

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);

希望这有助于某人!这个功能让我免于很多挫折。

答案 1 :(得分:5)

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

(不,我不知道为什么L和W前缀一直在混合)

答案 2 :(得分:2)

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;

答案 3 :(得分:0)

不要转换。

使用wprintf代替printf

请参阅the examples,其中说明了如何使用它。

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

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

同样,使用专为宽字符设计的函数,并忘记将wchar_t转换为char的想法,因为它可能会丢失数据。

在这里查看处理wide-char的函数:

答案 4 :(得分:0)

这是一个简单的解决方案。查看wsprintf

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

&#34;%S&#34;将隐式地将UNICODE转换为ANSI。

答案 5 :(得分:-1)

使用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,'\0',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);
}