Преобразование строки Юникода в строку

Я создал несколько классов C++ в C++ Builder. Теперь я использую их в приложении форм VCL. У меня есть функция, которая загружает текстовый файл и принимает строку в качестве аргумента.

Я использую элемент управления openDialog, чтобы перейти к файлу, а затем открыть его.

Моя проблема заключается в следующем: свойство .filename в openFialog имеет форму UnicodeString, и моей функции требуется std::string. Как я могу преобразовать строку Unicode в std::string?

Вот мой код:

OpenDialog1->Execute();
calCalendar.loadAppointmentsFromFile(OpenDialog1->FileName.t_str());

Вот определение функции:

void loadAppointmentsFromFile(const std::string& stringFilename);

Я получаю следующую ошибку:

[Ошибка BCC32] Assessment2.cpp(39): E2342 Несоответствие типов в параметре 'stringFilename' (требуется 'const std::string &', получено 'wchar_t *')

Могу ли я получить некоторую помощь, чтобы исправить эту проблему?


person user1690531    schedule 24.09.2012    source источник
comment
Вы про ИВЛ? Затем userguide.icu-project.org/conversion/converters   -  person    schedule 24.09.2012


Ответы (1)


Чтобы получить суженная струна. Тем не менее, вы должны подумать о том, чтобы не смешивать их.

Другой вариант - сначала преобразовать в AnsiString:

AnsiString str = OpenDialog1->FileName;
std::string s(str.c_str());
loadAppointmentsFromFile(s);

Or

std::string s = OpenDialog1->FileName.t_str(); // TCHAR mapping set to char
loadAppointmentsFromFile(s);
person Jesse Good    schedule 24.09.2012
comment
Спасибо за Ваш ответ. Тем не менее, у меня все еще есть проблема с моим кодом. Я добавил к своему исходному сообщению. Не могли бы вы взглянуть. Спасибо. - person user1690531; 24.09.2012
comment
@ user1690531: В моей ссылке есть ответ на ваш вопрос, для параметров TCHAR_mapping установлено значение wchar_t, перейдите к Project->Options->Directories and Conditionals и измените его на char. - person Jesse Good; 24.09.2012
comment
Я изменил его на char. Тем не менее, я все еще получаю ту же ошибку. - person user1690531; 24.09.2012
comment
@ user1690531: Хорошо, тогда попробуйте мой второй подход (хотя вам действительно следует использовать широкие строки). - person Jesse Good; 24.09.2012
comment
НЕ ИСПОЛЬЗУЙТЕ UnicodeString::t_str()!!! Это опасно, так как изменяет внутренние данные UnicodeString, что может иметь побочные эффекты. Кроме того, t_str() все равно был удален в более поздней версии C++Builder. Правильное решение этой проблемы — присвоить UnicodeString AnsiString, а затем использовать AnsiString::c_str(). - person Remy Lebeau; 25.09.2012