Difference between revisions of "Converting everything to and from wxString"
m (Text replacement - "</source>" to "</syntaxhighlight>") |
m (Text replacement - "<source>" to "<syntaxhighlight lang="cpp">") |
||
Line 3: | Line 3: | ||
== Literals == | == Literals == | ||
A literal is a string written in code with "quotes around it". A literal is not a wxString, and (in wxWidgets 2.8) will not be implicitly converted to one. This means that you can never pass in a raw literal into a wxWidget function or method (unless you don't care about your app not building with Unicode-enabled wxWidgets builds) | A literal is a string written in code with "quotes around it". A literal is not a wxString, and (in wxWidgets 2.8) will not be implicitly converted to one. This means that you can never pass in a raw literal into a wxWidget function or method (unless you don't care about your app not building with Unicode-enabled wxWidgets builds) | ||
− | < | + | <syntaxhighlight lang="cpp"> |
MessageBox("I'm a mistake!") // WRONG in WxWidgets 2.8 (OK in 3.0) | MessageBox("I'm a mistake!") // WRONG in WxWidgets 2.8 (OK in 3.0) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Instead, wxWidgets (prior to wxWidgets 3.0) requires you to use one of these macros to turn literals into wxString-compatible characters: | Instead, wxWidgets (prior to wxWidgets 3.0) requires you to use one of these macros to turn literals into wxString-compatible characters: | ||
− | < | + | <syntaxhighlight lang="cpp"> |
_("text that can be translated") | _("text that can be translated") | ||
wxT("text that won't be translated") | wxT("text that won't be translated") | ||
Line 23: | Line 23: | ||
Note that in wxWidgets 3.0, it just works to pass a char array where a wxString parameter is expected, the conversion will be automatic and implicit, using the current locale encoding. So even in wx 3.0, the snippets presented below still make sense when you don't want to be at the mercy of the current locale encoding. | Note that in wxWidgets 3.0, it just works to pass a char array where a wxString parameter is expected, the conversion will be automatic and implicit, using the current locale encoding. So even in wx 3.0, the snippets presented below still make sense when you don't want to be at the mercy of the current locale encoding. | ||
− | < | + | <syntaxhighlight lang="cpp"> |
const char* chars = "Hello world"; | const char* chars = "Hello world"; | ||
Line 36: | Line 36: | ||
== wxString to char* == | == wxString to char* == | ||
− | < | + | <syntaxhighlight lang="cpp"> |
void my_function(const char* foo) | void my_function(const char* foo) | ||
{ | { | ||
Line 48: | Line 48: | ||
mb_str() returns a temporary pointer; if you need the output for more than one function call (as is the case above), you can store the char buffer for a little while : | mb_str() returns a temporary pointer; if you need the output for more than one function call (as is the case above), you can store the char buffer for a little while : | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString s( wxT("some string") ); | wxString s( wxT("some string") ); | ||
wxCharBuffer buffer=s.ToUTF8(); | wxCharBuffer buffer=s.ToUTF8(); | ||
Line 57: | Line 57: | ||
And if you really need to copy it in to char* (but why would you? ;) : | And if you really need to copy it in to char* (but why would you? ;) : | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString mystring(wxT("HelloWorld")); | wxString mystring(wxT("HelloWorld")); | ||
char cstring[1024]; | char cstring[1024]; | ||
Line 67: | Line 67: | ||
From const char* to char*: | From const char* to char*: | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString mystring(wxT("HelloWorld")); | wxString mystring(wxT("HelloWorld")); | ||
(const_cast<char*>((const char*)mystring.mb_str())) | (const_cast<char*>((const char*)mystring.mb_str())) | ||
Line 73: | Line 73: | ||
Variadic functions (like printf) won't work with mb_str(), but this will work: | Variadic functions (like printf) won't work with mb_str(), but this will work: | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString mystring(wxT("HelloWorld")); | wxString mystring(wxT("HelloWorld")); | ||
printf("%s",mystring.mb_str().data()); | printf("%s",mystring.mb_str().data()); | ||
Line 79: | Line 79: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Alternatively, use the method recommended in [https://docs.wxwidgets.org/trunk/overview_unicode.html#overview_unicode_pitfalls Potential Unicode Pitfalls]: | Alternatively, use the method recommended in [https://docs.wxwidgets.org/trunk/overview_unicode.html#overview_unicode_pitfalls Potential Unicode Pitfalls]: | ||
− | < | + | <syntaxhighlight lang="cpp"> |
printf("%s", (const char*)mystring.mb_str()) | printf("%s", (const char*)mystring.mb_str()) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== wchar_t* to wxString == | == wchar_t* to wxString == | ||
− | < | + | <syntaxhighlight lang="cpp"> |
const wchar_t* chars = L"Hello world"; | const wchar_t* chars = L"Hello world"; | ||
wxString mystring(chars); | wxString mystring(chars); | ||
Line 91: | Line 91: | ||
== wxString to wchar_t* == | == wxString to wchar_t* == | ||
See the following methods in the docs : | See the following methods in the docs : | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString::wc_str() | wxString::wc_str() | ||
wxString::wchar_str() | wxString::wchar_str() | ||
Line 97: | Line 97: | ||
== wxString to TCHAR == | == wxString to TCHAR == | ||
− | < | + | <syntaxhighlight lang="cpp"> |
TCHAR tCharString[255]; | TCHAR tCharString[255]; | ||
wxString myString(_T("Hello World")); | wxString myString(_T("Hello World")); | ||
Line 108: | Line 108: | ||
== int to wxString == | == int to wxString == | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString mystring = wxString::Format(wxT("%i"),myint); | wxString mystring = wxString::Format(wxT("%i"),myint); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
or | or | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString mystring; | wxString mystring; | ||
mystring << myint; | mystring << myint; | ||
Line 118: | Line 118: | ||
== float to wxString == | == float to wxString == | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString mystring = wxString::Format(wxT("%f"), myfloat); | wxString mystring = wxString::Format(wxT("%f"), myfloat); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
or | or | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString mystring; | wxString mystring; | ||
mystring << myfloat; | mystring << myfloat; | ||
Line 128: | Line 128: | ||
== wxString to integer number == | == wxString to integer number == | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString number(wxT("145")); | wxString number(wxT("145")); | ||
long value; | long value; | ||
Line 136: | Line 136: | ||
or | or | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString str = _T("123"); | wxString str = _T("123"); | ||
int num; | int num; | ||
Line 145: | Line 145: | ||
== wxString to floating-point number == | == wxString to floating-point number == | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString number(wxT("3.14159")); | wxString number(wxT("3.14159")); | ||
double value; | double value; | ||
Line 152: | Line 152: | ||
== std::string to wxString == | == std::string to wxString == | ||
− | < | + | <syntaxhighlight lang="cpp"> |
std::string stlstring = "Hello world"; | std::string stlstring = "Hello world"; | ||
// assuming your string is encoded as UTF-8, change the wxConv* parameter as needed | // assuming your string is encoded as UTF-8, change the wxConv* parameter as needed | ||
Line 159: | Line 159: | ||
Starting from wxWidgets 3.0, you may also use the appropriate constructor | Starting from wxWidgets 3.0, you may also use the appropriate constructor | ||
− | < | + | <syntaxhighlight lang="cpp"> |
std::string stlstring = "Hello world"; | std::string stlstring = "Hello world"; | ||
// assuming your string is encoded as the current locale encoding (wxConvLibc) | // assuming your string is encoded as the current locale encoding (wxConvLibc) | ||
Line 168: | Line 168: | ||
wxWidgets 2.8 : | wxWidgets 2.8 : | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString mystring(wxT("HelloWorld")); | wxString mystring(wxT("HelloWorld")); | ||
std::string stlstring = std::string(mystring.mb_str()); | std::string stlstring = std::string(mystring.mb_str()); | ||
Line 174: | Line 174: | ||
Under wxWidgets 3.0, you may use | Under wxWidgets 3.0, you may use | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString::ToStdString() | wxString::ToStdString() | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 181: | Line 181: | ||
Starting from wxWidgets 3.0, you may use the appropriate constructor | Starting from wxWidgets 3.0, you may use the appropriate constructor | ||
− | < | + | <syntaxhighlight lang="cpp"> |
std::wstring stlstring = L"Hello world"; | std::wstring stlstring = L"Hello world"; | ||
// assuming your string is encoded as the current locale encoding (wxConvLibc) | // assuming your string is encoded as the current locale encoding (wxConvLibc) | ||
Line 189: | Line 189: | ||
== wxString to std::wstring == | == wxString to std::wstring == | ||
Under wxWidgets 3.0, you may use | Under wxWidgets 3.0, you may use | ||
− | < | + | <syntaxhighlight lang="cpp"> |
wxString::ToStdWstring() | wxString::ToStdWstring() | ||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 19:36, 19 October 2018
This question seems common so I thought I'd write an article. Note that sometimes there may be more than one possible solutions, so don't forget to check the docs.
Literals
A literal is a string written in code with "quotes around it". A literal is not a wxString, and (in wxWidgets 2.8) will not be implicitly converted to one. This means that you can never pass in a raw literal into a wxWidget function or method (unless you don't care about your app not building with Unicode-enabled wxWidgets builds)
MessageBox("I'm a mistake!") // WRONG in WxWidgets 2.8 (OK in 3.0)
Instead, wxWidgets (prior to wxWidgets 3.0) requires you to use one of these macros to turn literals into wxString-compatible characters:
_("text that can be translated")
wxT("text that won't be translated")
_T("same as wxT, but deprecated")
char* c = "sometext";
wxT(c) // WRONG, not a literal
Rather than being a nuisance, the _(), wxT(), and _T() macros take care of some unicode issues.
char* to wxString
Note that in wxWidgets 3.0, it just works to pass a char array where a wxString parameter is expected, the conversion will be automatic and implicit, using the current locale encoding. So even in wx 3.0, the snippets presented below still make sense when you don't want to be at the mercy of the current locale encoding.
const char* chars = "Hello world";
// if your string is UTF-8 encoded, this is the shortest path :
wxString mystring = wxString::FromUTF8(chars);
// You can also convert from many encodings by passing the
// appropriate wxConv... parameter to the constructor
wxString mystring2(chars, wxConvUTF8);
wxString to char*
void my_function(const char* foo)
{
}
...
wxString mystring(wxT("HelloWorld"));
// you could give the encoding you want as a parameter to mb_str(), e.g. mb_str(wxConvUTF8)
my_function( mystring.mb_str() );
mb_str() returns a temporary pointer; if you need the output for more than one function call (as is the case above), you can store the char buffer for a little while :
wxString s( wxT("some string") );
wxCharBuffer buffer=s.ToUTF8();
foo( buffer.data() ); // data() returns const char *
bar( buffer.data(), strlen(buffer.data()) ); // in case you need the length of the data
And if you really need to copy it in to char* (but why would you? ;) :
wxString mystring(wxT("HelloWorld"));
char cstring[1024];
// assuming you want UTF-8, change the wxConv* parameter as needed
strncpy(cstring, (const char*)mystring.mb_str(wxConvUTF8), 1023);
You can also use ToUTF8(), since which encoding you get is clearer than with mb_str()
From const char* to char*:
wxString mystring(wxT("HelloWorld"));
(const_cast<char*>((const char*)mystring.mb_str()))
Variadic functions (like printf) won't work with mb_str(), but this will work:
wxString mystring(wxT("HelloWorld"));
printf("%s",mystring.mb_str().data());
Alternatively, use the method recommended in Potential Unicode Pitfalls:
printf("%s", (const char*)mystring.mb_str())
wchar_t* to wxString
const wchar_t* chars = L"Hello world";
wxString mystring(chars);
wxString to wchar_t*
See the following methods in the docs :
wxString::wc_str()
wxString::wchar_str()
wxString to TCHAR
TCHAR tCharString[255];
wxString myString(_T("Hello World"));
const wxChar* myStringChars = myString.c_str();
for (int i = 0; i < myString.Len(); i++) {
tCharString[i] = myStringChars [i];
}
tCharString[myString.Len()] = _T('\0');
int to wxString
wxString mystring = wxString::Format(wxT("%i"),myint);
or
wxString mystring;
mystring << myint;
float to wxString
wxString mystring = wxString::Format(wxT("%f"), myfloat);
or
wxString mystring;
mystring << myfloat;
wxString to integer number
wxString number(wxT("145"));
long value;
if(!number.ToLong(&value)) { /* error! */ }
or
wxString str = _T("123");
int num;
num = wxAtoi(str);
wxString to floating-point number
wxString number(wxT("3.14159"));
double value;
if(!number.ToDouble(&value)){ /* error! */ }
std::string to wxString
std::string stlstring = "Hello world";
// assuming your string is encoded as UTF-8, change the wxConv* parameter as needed
wxString mystring(stlstring.c_str(), wxConvUTF8);
Starting from wxWidgets 3.0, you may also use the appropriate constructor
std::string stlstring = "Hello world";
// assuming your string is encoded as the current locale encoding (wxConvLibc)
wxString mystring(stlstring);
wxString to std::string
wxWidgets 2.8 :
wxString mystring(wxT("HelloWorld"));
std::string stlstring = std::string(mystring.mb_str());
Under wxWidgets 3.0, you may use
wxString::ToStdString()
std::wstring to wxString
Starting from wxWidgets 3.0, you may use the appropriate constructor
std::wstring stlstring = L"Hello world";
// assuming your string is encoded as the current locale encoding (wxConvLibc)
wxString mystring(stlstring);
wxString to std::wstring
Under wxWidgets 3.0, you may use
wxString::ToStdWstring()