WCHAR*->char*
От: MAPCUAHUH  
Дата: 12.07.05 14:10
Оценка:
Здраствуйте,
Как перевести из WCHAR* в char*?
Re: WCHAR*->char*
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 12.07.05 14:19
Оценка:
Здравствуйте, MAPCUAHUH, Вы писали:

MAP> Как перевести из WCHAR* в char*?


WideCharToMultiByte()/wcstombs()
[ posted via RSDN@Home 1.1.4 beta 7 r501, accompanied by Metallica — The Unforgiven ]
- Искренне ваш, Поросенок Пафнутий
Re: WCHAR*->char*
От: Кодт Россия  
Дата: 12.07.05 14:33
Оценка:
Здравствуйте, MAPCUAHUH, Вы писали:

MAP>Здраствуйте,

MAP> Как перевести из WCHAR* в char*?

Это смотря что у тебя по этому указателю хранится...
Ну предположим, что строка. Тогда так

1) MS-specific — WideCharToMultiByte
// начальные условия
WCHAR const* src_string;
UINT dst_codepage; // CP_ACP - дефолтное, CP_UTF8 и т.п.

DWORD const flags = 0; // читай документацию
int dst_length = WideCharToMultiByte(dst_codepage, flags, src_string, -1, NULL, 0, NULL, NULL); // получил размер
char* dst_string = new char[dst_length+1]; // выделил память своим любимым способом
WideCharToMultiByte(dst_codepage, flags, src_string, -1, dst_string, dst_length+1, NULL, NULL); // преобразовал


2) STD C — wcstombs + пляски с locale
wchar_t const* src_string;

size_t dst_length = wcstombs(NULL,src_string,0);
char* dst_string = new char[dst_length+1];
wcstombs(dst_string,src_string,0);


3) libiconv — iconv_open, iconv, iconv_close (см. http://www.gnu.org/software/libiconv/)
Перекуём баги на фичи!
Re: WCHAR*->char*
От: Ka3a4oK  
Дата: 12.07.05 19:22
Оценка:
Здравствуйте, MAPCUAHUH, Вы писали:

MAP>Здраствуйте,

MAP> Как перевести из WCHAR* в char*?

В ATL есть String Conversion Macros.

A2BSTR   OLE2A      T2A      W2A 
A2COLE   OLE2BSTR   T2BSTR   W2BSTR 
A2CT     OLE2CA     T2CA     W2CA 
A2CW     OLE2CT     T2COLE   W2COLE 
A2OLE    OLE2CW     T2CW     W2CT 
A2T      OLE2T      T2OLE    W2OLE 
A2W      OLE2W      T2W      W2T


Это просто сказка. Конвертирование выполяется примерно так.

void func( LPSTR lpsz )
{
USES_CONVERSION;
...
LPWSTR x = A2W(lpsz)
// Do something with x
...
}

Если можно использовать ATL, то рекомендую.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[2]: WCHAR*->char*
От: jedi Мухосранск  
Дата: 13.07.05 06:30
Оценка: 23 (1)
Здравствуйте, Ka3a4oK, Вы писали:

KK>Здравствуйте, MAPCUAHUH, Вы писали:


<>

KK>Это просто сказка. Конвертирование выполяется примерно так.


Сказка, то сказка ... но, к примеру:

#define A2W(lpa) (\
    ((_lpa = lpa) == NULL) ? NULL : (\
        _convert = (lstrlenA(_lpa)+1),\
        ATLA2WHELPER((LPWSTR) alloca(_convert*2), _lpa, _convert, _acp)))


так шта в циклах которые будут выполняться много раз использовать нельзя — stack overflow однако .
Это я к тому что на эти грабли наступал и долго не мог понять в чем дело, пока в макрос не заглянул
Может кого-то спасет от пары часов нудного дебага

Best regards,
jedi
Re[3]: WCHAR*->char*
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 13.07.05 09:41
Оценка: 6 (1)
Здравствуйте, jedi, Вы писали:

J>Сказка, то сказка ... но, к примеру:


J>
J>#define A2W(lpa) (\
J>    ((_lpa = lpa) == NULL) ? NULL : (\
J>        _convert = (lstrlenA(_lpa)+1),\
J>        ATLA2WHELPER((LPWSTR) alloca(_convert*2), _lpa, _convert, _acp)))
J>


J>так шта в циклах которые будут выполняться много раз использовать нельзя — stack overflow однако .


В ATL 7.0 починили:

The new conversion classes which require a buffer (CA2AEX, CA2WEX, CW2AEX, and CW2WEX) use a fixed-size static buffer to store the result of the conversion. If the result is too large to fit into the static buffer, the class allocates memory using malloc, freeing the memory when the object goes out of scope. This ensures that, unlike the older text conversion macros, these classes are safe to use in loops and won't overflow the stack.


И вот сравнение:
Old ATL 3.0 Conversion Macros           New ATL 7.0 Conversion Classes 
Allocates memory on the stack.              Uses stack memory for small strings. 
                                            Uses the heap if the stack is not large enough. 

The string is freed when the function       The string is freed when the variable goes out of scope. 
is exited. 

Cannot be used in exception handlers.       Can be used in exception handlers. 

Not suitable for use in loops.              Supports use in loops. Loop scope ensures that memory is 
Memory use grows until the function is      freed on each iteration.
exited.   

Not good for large strings. Stack space     No problems with large strings. Strings will be 
is limited.                                 allocated on the heap.

Usually require USES_CONVERSION to be       Never require USES_CONVERSION to be defined.
defined.
  
Meaning of OLE depends on definition of     OLE is always equivalent to W. 

OLE2ANSI.
HgLab: Mercurial Server and Repository Management for Windows
Re[4]: WCHAR*->char*
От: jedi Мухосранск  
Дата: 13.07.05 10:15
Оценка: +1
Здравствуйте, Нахлобуч, Вы писали:

<>

Ключевое слово: New ATL 7.0 Conversion Classes — а макросы остались старые (тот что я приводил как раз из ATL 7.0). Так что вывод очевидный — не юзать макросы at all if its possible
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.