如何在C ++ Builder中将AnsiString转换为std :: string?

时间:2018-07-17 10:26:47

标签: string text casting edit c++builder

我想问一下如何从TEdit控件获取文本输入并将其转换为std::string(不是AnsiString)。

例如,如果我有一个名为TEdit的{​​{1}}控件,则可以使用User命令从中获取文本。我想做的就是将该值分配给User->Text,例如std::string

我想问一下,如何在C ++ Builder中做到这一点?是否存在某种string my_str = User->Text;方法或某种方法,因为我找不到方法。

2 个答案:

答案 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());