我想问一下如何从TEdit
控件获取文本输入并将其转换为std::string
(不是AnsiString
)。
例如,如果我有一个名为TEdit
的{{1}}控件,则可以使用User
命令从中获取文本。我想做的就是将该值分配给User->Text
,例如std::string
。
我想问一下,如何在C ++ Builder中做到这一点?是否存在某种string my_str = User->Text;
方法或某种方法,因为我找不到方法。
答案 0 :(得分:0)
在C ++ Builder 2007和更早版本中,TEdit::Text
是用户的默认ANSI语言环境中的8位AnsiString
。将AnsiString
转换为std::string
是非常直接的-只需使用AnsiString::c_str()
方法即可获取指向char*
数据的以空值结尾的AnsiString
指针,然后可以将其分配给std::string
,例如:
std::string my_str = User->Text.c_str();
/* or:
System::AnsiSystem text = User->Text;
std::string my_str(text.c_str(), text.Length());
*/
如果您希望std::string
数据采用其他字符编码(例如UTF-8),则必须相应地转换AnsiString
数据,例如使用MultiByteToWideChar()
/ WideCharToMultiByte()
,UTF8Encode()
等,然后将其分配给std::string
。
在C ++ Builder 2009和更高版本中,TEdit::Text
是UTF-16格式的16位UnicodeString
。将UnicodeString
转换为std::string
的最简单方法是先转换为AnsiStringT<CP>
(其中CP
是所需的ANSI代码页-AnsiString
使用{{ 1}},CP=0
使用UTF8String
等),然后将其转换为CP=65001
,例如:
std::string
或者,在C ++ 11和更高版本中,您可以先将std::string my_str = AnsiString(User->Text).c_str(); // or UTF8String, etc...
/* or:
System::AnsiString text = User->Text; // or UTF8String, etc...
std::string my_str(text.c_str(), text.Length());
*/
转换为UnicodeString
,然后再使用std::wstring_convert
,例如:
std::wstring
答案 1 :(得分:0)
我有很多人要从Borland迁移到Embarcadero Rio。所以我创建了一种方法来做。
#include <cwchar.h> //std::wcslen
char* __fastcall AnsiOf(wchar_t* w)
{
static char c[STR_CONV_BUF_SIZE];
memset(c, 0, sizeof(c));
WideCharToMultiByte(CP_ACP, WC_NO_BEST_FIT_CHARS, w, std::wcslen(w), c, STR_CONV_BUF_SIZE, NULL, NULL);
return c;
}
std::string my_str = AnsiOf((User->Text).c_str());