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

一、各种字符串类型介绍

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、关于字符串的长度函数:

	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);
	// 转换成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);
2、GB2312转换成unicode
	// 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);
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();




















你可能感兴趣的:(wxWidgets)