cli::pin_ptr<const wchar_t> wch = PtrToStringChars(str);
size_t convertedChars = 0;
size_t sizeInBytes = (str->Length + 1) * 2;
errno_t err = 0;
char* ch = (char*)malloc(sizeInBytes);
err = wcstombs_s(&convertedChars, ch, sizeInBytes, wch, sizeInBytes);
if(err != 0)
MessageBox::Show("wcstombs_s failed!\n");
return(ch);
wcstombs_s, конвертирование с русскими символами
Нужно сконвертить из String^ в char. Вызываю wcstombs_s. Проблема в том, что если в строке все написано латиницей, то конвертирование проходит на ура. Но если попадается хотя бы один символ кириллицей, то функция выдает ошибку.((
Цитата: Karrde
Нужно сконвертить из String^ в char.
String::ToCharArray
В общем, я взял этот код из учебника. походу он сначала конвертит из String^ в wchar_t, а потом из wchar_t в char*. И как раз первое действие проходит успешно. а вот на втором-запарывается. Извините, походу сначала неправильно выразился
Код:
Цитата: Karrde
Эээ. Не совсем понял.
Дык, я к C# привык :)
Там char свой.
Как вариант - использование кодовой страницы 1251:
Код:
char* GetChars(int codepage, System::String^ text) {
array<System::Byte>^ text_bytes = System::Text::Encoding::GetEncoding(codepage)->GetBytes(text);
char* result = new char[text_bytes->Length + 1];
for(int i = 0; i < text_bytes->Length; ++i) {
result = (char) text_bytes;
}
result[text_bytes->Length] = '\0';
return result;
}
array<System::Byte>^ text_bytes = System::Text::Encoding::GetEncoding(codepage)->GetBytes(text);
char* result = new char[text_bytes->Length + 1];
for(int i = 0; i < text_bytes->Length; ++i) {
result = (char) text_bytes;
}
result[text_bytes->Length] = '\0';
return result;
}
Получаем соответствующий объект Encoding, у которого требуем GetBytes - каждый байт собственно и будет C++ным char-ом.
Или вызывайте setlocale с пустой строкой в качестве имени локали - подгрузится локаль из окружения.