Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Очень нужна помощь по winforms

3213 4325423 Ученик (79), открыт 2 недели назад
Есть textbox, в котором пользователь что-то вводит. Поскольку textbox работает не через обычный string, а через String^, я сделал такую конвертацию:

 std::string convert_to_string(System::String^ txt_input) 
{
setlocale(LC_ALL, "Russian");
std::string txt = "";
for (int i = 0; i < txt_input->Length; i++)
{
char temp = txt_input[i];
std::cout << "|" << temp << std::endl;
txt = txt + temp;
}
return txt;
}
С английским все нормально. Но вот с русским возникают проблемы, например если ввести "АБВ", то char temp превращается не в "А", "Б", "В", а в "►", "◄", "↕".

В то же время txt_input[i] превращается в 1040, 1041, 1042

Что делать?
1 ответ
Татьяна Просветленный (29221) 2 недели назад
Ваша проблема заключается в том, что тип char не поддерживает кодировки UTF-16, которые используются в System::String^. В результате вы получаете некорректные символы при работе с русским текстом. Для решения этой проблемы можно воспользоваться marshal для конвертации System::String^ в std::string, сохраняя корректные символы.

Ниже представлен корректный способ конвертации System::String^ в std::string:
 #include  
#include
#include

// Функция для конвертации System::String^ в std::string
std::string convert_to_string(System::String^ txt_input)
{
// Используем msclr::interop::marshal_context для конвертации
msclr::interop::marshal_context context;
std::string txt = context.marshal_as(txt_input);
return txt;
}
Этот код использует msclr::interop::marshal_context для конвертации System::String^ в std::string. Он автоматически обрабатывает символы в кодировке UTF-16 и корректно преобразует их в UTF-8, что позволяет вам работать с русским текстом без проблем.

Кроме того, если вы хотите конвертировать строки без использования msclr, вы можете сделать это вручную с использованием Encoding:

 #include  
#include
#include

std::string convert_to_string(System::String^ txt_input)
{
// Преобразование System::String^ в массив байтов
array^ bytes = System::Text::Encoding::UTF8->GetBytes(txt_input);

// Преобразование массива байтов в std::string
std::string txt;
for (int i = 0; i < bytes->Length; i++)
{
txt += bytes[i];
}

return txt;
}
Этот метод также конвертирует System::String^ в std::string, но делает это вручную, используя кодировку UTF-8. Выбирайте метод, который вам больше подходит для вашего проекта.
3213 4325423Ученик (79) 2 недели назад
Без этой библиотеки нужно
Похожие вопросы