wxWidget教程(8)——字符串与转换

来源:互联网 发布:php 协程 异步 编辑:程序博客网 时间:2024/05/22 08:02

一、各种字符串类型介绍

1、wxScopedCharTypeBuffer< T >

这是一个字符串模版类,根据<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、关于字符串的长度函数:

wxString str = wxT("hello world!");// 下面2个求长度函数效果一样size_t len = str.Len();size_t len = str.Length();// 下面3个判断字符串是否为空,效果一样str.IsEmpty();str.IsNull();!str;
3、读取或写入字符串中的一个字符
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'));
4、拼接与拆分字符串

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(),也可以如下:

// UTF8编码字符串char ch[] = u8"中国人";// unicode字符串wchar_t wch[255] = {0};wxWCharBuffer wchBuffer;size_t bufferLen = 255;wchBuffer.extend(bufferLen);// 转换成unicodewxMBConvUTF8 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);
2、GB2312转换成unicode
// GB2312编码字符串char ch[] = "中国人";// unicode字符串wchar_t wch[255] = {0};wxWCharBuffer wchBuffer;size_t bufferLen = 255;wchBuffer.extend(bufferLen);// 转换成unicodewxCSConv 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);
3、相反转换时,道理是一样的

只要把函数颠倒过来就行了,比如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、转为整型

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);
2、转为字符串

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




















阅读全文
0 0