【问题标题】:How to convert AnsiString to std::string in C++ Builder?如何在 C++ Builder 中将 AnsiString 转换为 std::string?
【发布时间】:2018-07-17 10:26:46
【问题描述】:

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

例如,如果我有一个名为UserTEdit 控件,我会使用User->Text 命令从中获取文本。我想要做的是将该值分配给std::string,例如string my_str = User->Text;

我想问一下,我如何在 C++ Builder 中做到这一点?是否有某种ToString() 方法或某种,因为我找不到。

【问题讨论】:

标签: string text casting edit c++builder


【解决方案1】:

在 C++Builder 2007 及更早版本中,TEdit::Text 是用户默认 ANSI 语言环境中的 8 位 AnsiString。将AnsiString 转换为std::string 非常简单——只需使用AnsiString::c_str() 方法获取指向AnsiString 数据的空终止char* 指针,然后您可以将其分配给@ 987654329@,如:

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()、@987654335 @等,然后将其分配给std::string


在 C++Builder 2009 及更高版本中,TEdit::Text 是 UTF-16 格式的 16 位 UnicodeString。将UnicodeString 转换为std::string 的最简单方法是首先转换为AnsiStringT<CP>(其中CP 是所需的ANSI 代码页-AnsiString 使用CP=0UTF8String 使用CP=65001,等),然后将其转换为std::string,例如:

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());
*/

或者,在 C++11 及更高版本中,您可以先将UnicodeString 转换为std::wstring,然后使用std::wstring_convert,例如:

#include <locale>

std::wstring my_wstr = User->Text.c_str();
/* or:
System::UnicodeString text = User->Text;
std::wstring my_wstr(text.c_str(), text.Length());
*/

// System::Char may be either wchar_t or char16_t, depending
// on which platform you are compiling for...
std::string my_str = std::wstring_convert<std::codecvt_utf8_utf16<System::Char>>{}.to_bytes(my_wstr);

【讨论】:

    【解决方案2】:

    我有很多人要从 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());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多