一、各种字符串类型介绍
1、wxScopedCharTypeBuffer< T >
这是一个字符串模版类,根据
来决定存储的字符类型。 这里涉及到两个概念:所有权与非所有权。
所有权:对缓存区的数据有完全的占有权,当本类指针删除时,缓存区也会被清空。
非所有权:即缓存区的数据被别人所拥有,本类只保留了缓存区的一个引用,本类删除,缓存区不会被清空。
// 创建一个没有所有权的字符缓存区 wxScopedCharBuffer nonOwnedBuffer = wxScopedCharBuffer::CreateNonOwned("hello"); // 创建一个拥有所有权的字符缓存区 wxScopedCharBuffer ownedBuffer = wxScopedCharBuffer::CreateOwned("hello"); // 清空字符缓存区 ownedBuffer.reset(); // 返回字符缓存区数据的指针 char* ch = ownedBuffer.data(); // 返回字符缓存区的长度 size_t len = ownedBuffer.length(); // 缓存数据没有被共享时,可以调用此函数,有风险,因为有可能指针被释放了 char* ch = ownedBuffer.release();
2、wxCharTypeBuffer< T >
这个是上面的类的特例:即纯所有权版本,本类指针删除,缓存区会被清空。
你可以通过extend与shrink来对缓冲区的长度进行扩充和收缩。收缩时,必须保证引用计数为1.
3、wxChar
这个根据项目的环境来决定,相当于windows中的TCHAR。
仅当wxUSE_UNICODE为1,并且wxUSE_UNICODE_WCHAR也为1时,wxChar表示wchar_t,其他情况下都是char。
然而wxUSE_UNICODE_WCHAR只有在windows下,才为1。
4、wxUniChar与wxUniCharRef
这个是指,单个unicode字符类型,它其实是个类,而不是wchar_t。
Ref是指引用,即单个unicode字符类的引用。
二、wxString类
1、构造函数,基本涵盖了所有的字符、字符串和字符引用类型,均可构造为wxString,例如:
char | wchar_t | wxUniChar | wxUniCharRef | const char * | const wchar_t *
const wxCharBuffer & | const wxWCharBuffer & | const string & | const wstring &
还有一些特殊的构造,需要借助编码转换器,如下:
// 从utf8编码的字符串构造 wxMBConvUTF8 cvtUTF8; wxString str(u8"中国人", cvtUTF8);
2、关于字符串的长度函数:
3、读取或写入字符串中的一个字符wxString str = wxT("hello world!"); // 下面2个求长度函数效果一样 size_t len = str.Len(); size_t len = str.Length(); // 下面3个判断字符串是否为空,效果一样 str.IsEmpty(); str.IsNull(); !str;
4、拼接与拆分字符串wxString str = wxT("hello world!"); // 获取一个只读的字符 wxUniChar uch1 = str[1]; wxUniChar uch2 = str.GetChar(2); wxUniChar ltch = str.Last(); // 获取一个可写的字符,即字符引用 wxUniCharRef uchf1 = str[1]; wxUniCharRef uchf2 = str.GetWritableChar(2); wxUniCharRef ltchf = str.Last(); // 修改字符串中的字符 str.SetChar(10, wxUniChar('A'));
wxString str = wxT("hello world!"); // 3种方式拼接一个字符串 str.Append("Good "); str += "morning"; str << "!"; // 9种方式拆分字符串 wxString subStr1 = str.Mid(1,5); wxString subStr2 = str.SubString(1,6); wxString subStr3 = str(1,5); wxString subStr4 = str.AfterFirst(wxUniChar('w')); wxString subStr5 = str.AfterLast(wxUniChar('w')); wxString subStr6 = str.BeforeFirst(wxUniChar('w')); wxString subStr7 = str.BeforeLast(wxUniChar('w')); wxString subStr8 = str.Left(7); wxString subStr9 = str.Right(5);
wxStringTokenizer tkz(wxT("hello:world:good:morning."),wxT(":")); while (tkz.HasMoreTokens()) { wxString token = tkz.GetNextToken(); }
5、字符串比较
wxString str = wxT("H"); str.Cmp(wxT("H")); str.CmpNoCase(wxT("h")); str.StartsWith(wxT("H")); str.EndsWith(wxT("H")); str.IsSameAs(wxUniChar('H')); str.IsSameAs(wxT("H")); str.Matches(wxT("*"));
三、字符串编码转换
1、UTF8转换成unicode
可以使用wxString::FromUTF8(),也可以如下:
2、GB2312转换成unicode// UTF8编码字符串 char ch[] = u8"中国人"; // unicode字符串 wchar_t wch[255] = {0}; wxWCharBuffer wchBuffer; size_t bufferLen = 255; wchBuffer.extend(bufferLen); // 转换成unicode wxMBConvUTF8 cvtUTF8; cvtUTF8.ToWChar(wch, sizeof(wch), ch, sizeof(ch)); wchBuffer = cvtUTF8.cMB2WC(ch, sizeof(ch), &bufferLen); size_t len = cvtUTF8.MB2WC(wch, ch, sizeof(wch)); wchBuffer = cvtUTF8.cMB2WX(ch);
3、相反转换时,道理是一样的// GB2312编码字符串 char ch[] = "中国人"; // unicode字符串 wchar_t wch[255] = {0}; wxWCharBuffer wchBuffer; size_t bufferLen = 255; wchBuffer.extend(bufferLen); // 转换成unicode wxCSConv cvtCS(wxT("GB2312")); cvtCS.ToWChar(wch, sizeof(wch), ch, sizeof(ch)); wchBuffer = cvtCS.cMB2WC(ch, sizeof(ch), &bufferLen); size_t len = cvtCS.MB2WC(wch, ch, sizeof(wch)); wchBuffer = cvtCS.cMB2WX(ch);
只要把函数颠倒过来就行了,比如cMB2WC修改为cWC2MB.
4、利用wxString本身的转换函数
wxString str = wxT("Hello World!"); // c_str()是一个大杂烩的轻量转换类,只返回内部数据的指针 wxCStrData data = str.c_str(); const char * ch = data.AsChar(); const wchar_t* wch = data.AsWChar(); wxScopedCharBuffer schBuffer = data.AsCharBuf(); wxScopedWCharBuffer swchBuffer = data.AsWCharBuf(); // 特别指明转换目标的 wxScopedCharBuffer bufferGBK = str.mb_str(wxCSConv(wxT("GB2312"))); wxScopedCharBuffer bufferUTF8 = str.utf8_str(); const wchar_t * wch = str.wc_str();
四、字符串与整型互转
1、转为整型
2、转为字符串wxString szNum = wxT("123456"); double d; long l; unsigned long ul; wxLongLong_t ll; wxULongLong_t ull; szNum.ToDouble(&d); szNum.ToLong(&l,10); szNum.ToULong(&ul,10); szNum.ToLongLong(&ll,10); szNum.ToULongLong(&ull,10);
wxString szNum = wxString::FromDouble(123);
wxString szNum = wxString::Format(wxT("%d"),123);
五、常用的字符串处理函数
wxString szStr = wxT("Hello World!");
// 清空字符串,不释放内存
szStr.Empty();
// 清空字符串,释放内存
szStr.Clear();
// 补全字符串到一定长度
szStr.Pad(20, wxUniChar('H'),true);
// 去掉空白字符
szStr.Trim();
// 大小写变换
szStr.MakeLower();
szStr.MakeUpper();
szStr.Lower();
szStr.Upper();
szStr.LowerCase();
szStr.UpperCase();
// 首字母大写
szStr.Capitalize();
szStr.MakeCapitalized();