Тема: Преобразование char в wchar_t

Здравствуйте!

Функция конвертирования char в wchar_t:

void charToWchar()
{
    char *mbstr = "Hello" ;    

    int requiredSize = mbstowcs(NULL, mbstr, 0);

    wchar_t *wcstr =  (wchar_t *) malloc(requiredSize * 2);

    size_t convertedChars = 0;

    convertedChars = mbstowcs(wcstr, mbstr, requiredSize) ;

    acutPrintf( _T("\nConvert to wide-character string: ") ) ;
    acutPrintf( wcstr ) ;
    acutPrintf( _T("\nCharacters converted: %d"), convertedChars ) ;
}

Подскажите пожалуйста, в чем ошибка? При выводе в AutoCAD выдает результат:
Convert to wide-character string: Hello଻Л
Characters converted: 5

(изменено: Николай, 31 мая 2012г. 18:04:20)

Re: Преобразование char в wchar_t

wchar_t *wcstr =  (wchar_t *) malloc(requiredSize * 2);

кажись на 2 умножатьне надо? тип то уже wchar стоит. вот оно мусор и выплевывает, какой в оперативке нашло.
ИМХО, wcstr убить ручками надо, а то до добра это не доведет.


-------------

std::string tmpValue = "привет";
wchar_t result[1024];
int requiredSize = mbstowcs(NULL, tmpValue.c_str(), 0); 
if (mbstowcs(result, tmpValue.c_str(), requiredSize + 1) == (size_t) (-1))
  wcsncpy(result,_T("\0"),1024);

-> тут на выхлопе уже заполненная переменная result или пустая, если функция отработала криво

(изменено: Shraybicus, 31 мая 2012г. 18:06:44)

Re: Преобразование char в wchar_t

Николай пишет:

кажись на 2 умножатьне надо

Пробовал так - не помогало.

Николай пишет:

ИМХО, wcstr убить ручками надо, а то до добра это не доведет.

Приму к сведению!

Сделал небольшые изменения в функции и все стало ок.)

void charToWchar()
{
    char *mbstr = "Hello" ;    

    int requiredSize = mbstowcs(NULL, mbstr, 0) + 1; // Corrected

    wchar_t *wcstr = new wchar_t[requiredSize]; // Corrected

    size_t convertedChars = 0;

    convertedChars = mbstowcs(wcstr, mbstr, requiredSize) ;

    acutPrintf( _T("\nConvert to wide-character string: ") ) ;
    acutPrintf( wcstr ) ;
    acutPrintf( _T("\nCharacters converted: %d"), convertedChars ) ;

    free(mbstr); // New
    free(wcstr); // New
}

(изменено: Shraybicus, 31 мая 2012г. 18:15:39)

Re: Преобразование char в wchar_t

Николай пишет:
std::string tmpValue = "привет";

wchar_t result[1024];

int requiredSize = mbstowcs(NULL, tmpValue.c_str(), 0); 

if (mbstowcs(result, tmpValue.c_str(), requiredSize + 1) == (size_t) (-1))

  wcsncpy(result,_T("\0"),1024);



-> тут на выхлопе уже заполненная переменная result или пустая, если функция отработала криво

Пожалуйста, можешь пояснить последние две строчки? Не понимаю.(

В msdn написано, что mbstowcs возвращает "-1", когда встречается недопустимый символ.

Re: Преобразование char в wchar_t

предпоследняя строка - попытка перегнать в unicode, а если это не получилось, то
последняя строка - тупо почистить переменную unicod-a (на всякий случай. по идее и так строка должна остаться пустой, но лучше перестраховаться).

Re: Преобразование char в wchar_t

Спасибо! Понятно.