как конфертировать из LPWSTR в 'const char *' - PullRequest
4 голосов
/ 23 марта 2012

После получения структуры из C # в C ++ с использованием C ++ / CLI:

public value struct SampleObject
{   
    LPWSTR a;    
};

Я хочу напечатать его экземпляр:

printf(sampleObject->a);

, но я получил эту ошибку:

Ошибка 1 ошибка C2664: «printf»: невозможно преобразовать параметр 1 из «LPWSTR» в «const char *»

Как преобразовать из LPWSTR to char*?

Заранее спасибо.

Ответы [ 6 ]

19 голосов
/ 04 августа 2012

Используйте функцию 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);

Надеюсь, это кому-то помогло!Эта функция избавила меня от многих разочарований.

5 голосов
/ 23 марта 2012

Просто используйте printf("%ls", sampleObject->a). Использование l в %ls означает, что вы можете передать wchar_t[], например L"Wide String".

(Нет, я не знаю, почему префиксы L и W постоянно смешиваются)

2 голосов
/ 23 марта 2012
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;
0 голосов
/ 15 мая 2018

Вот простое решение.Проверьте wsprintf

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

"% S" неявно преобразует UNICODE в ANSI.

0 голосов
/ 05 марта 2018

используйте 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);
}
0 голосов
/ 23 марта 2012

Не конвертируйте.

Используйте wprintf вместо printf:

См. примеры , в которых объясняется, как его использовать.

В качестве альтернативы вы можете использовать std::wcout как:

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

Точно так же используйте функции, предназначенные для широкоугольных символов, и забудьте об идее преобразования wchar_t в char, поскольку это может привести к потере данных.

Посмотрите на функции, которые имеют дело с wide-char здесь:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...