不知道其他朋友在写C++程序时会不会感觉到一点郁闷,就是字符串的处理。像在Delphi、C#中对字符串处理都是非常的简单,有大量的函数支持,而且string都是以关键字形式存在,编绎器进行了优化处理。所以使用起来时无需考虑太多。而一到c/c++字符串基本上占了我大部分的调试时间,外加上指钟等概念的模糊理解,更是血上加霜。所以将这段时间对字符串的处理总结一下,虽然还有很多困惑,还有许多问题。
1、整一下字符串的概念 在c++中一个字符用char表示,char占一个字节。所有的英文字母、数字和标点符号都是单字节的,当然除了全角的标点,也就是ansi字符。反正是个什么国际标准,我知道在Delphi2009之前的版本中都是使用的AnsiString。
字符串就是将一串字符连起来就是字符串,实际就是一个字符的数组。比如可以这样申明一个字符串变量:
char *str = "mini188";
int n = strlen(str);
字符串的首字节即str[0]的指针就是字符串的首地址,用指针指向这个地址就能获得整个串了,这里还要知道一点就是每一个字符串的结尾都会带一个'\0',这就是串的结束了。
写到这里时有点心虚啦,确实看概念和理解概念是两个阶段,其实我还是没有完全的理解字符串,所以写的时候感觉力不从心,所以暂时就写关于字符串的概念就不再多说,接下来主要说些应用相关的东西。
2、Wince中的字符处理回到M8SDK开发,不知道朋友们发现没,在Wince中所有的字符编码都是uniocde的,而前面我们介绍了char字符串,是Ansi编码的,我在写学习INI哪篇 文章时就提到过一个问题:在Windowsxp写手写的ini文件不能在wince中正常读写,其实这就是字符编码整的结果,在windowsxp中建立的一份文本文件默认使用的是ansi编码,到wince中当然失败啦,你可能想知道为什么吧?其实,哎,又要整概念啦,关键就在unicode编码和Ansi编码的区别上。
Ansi将字符串按一个字节为单位,所以读写ansi其实就可以一个char一个char的识别。
unicode的最小单位是两个字节,中文字符都是占两个字符的,所以读的时候要2个char一起读才是正确的。
明白啦吧,理解了这个,再来看一个比较郁闷的问题。
今天在写一个功能读取文本文件内容。这个功能看起来很简单,如果在Delphi或者C#中都是很容易处理的,但是在WinCE环境中遇到问题了!~~~ 就是因为uniocde!!!!!!
我在网上找了一堆的关于读取文本文件的代码,例子,说明都是ansistring的,我举个最简单的例子,你如何把从文本文件里读出来的字符串用MzMessageBoxEx显示出来?就为这,我弄了十几个小时。当然这可能是我本人能力问题。MzMessageBoxEx默认的是wchar_t,死了吧?你char他压根不理你。
我跑到窗户边上吐了一口血,然后回到电脑边上继续找结果,网上有朋友给出了办法就是将char解析为wchar_t,这样就可以实现了。说到这,又得整一下char和wchar_t的区别了是吧?
char前面说了是一个字节,也就是8位wchar_t 是两个字节,是16位,常称宽字符经过在哪该死的慢的要死的模拟器上显示出文本内容,我不断的在调试,下面就是实现转换的代码:
- void chr2wch(const char *buffer, wchar_t *wBuf)
- {
- size_t len = strlen(buffer);
- size_t wlen = MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), NULL, 0);
- wBuf = new wchar_t[wlen + 1];
- MultiByteToWideChar(CP_ACP, 0, (const char*)buffer, int(len), wBuf, int(wlen));
- }
复制代码使用这个函数,将char字符串传进来,第二个参数传出来的就是想要的结果了。这样就完成了整个的过程。
最后,希望没有C++基础或者开发基础比较弱的朋友,和我一样还是多看看基础的东西吧,这些其实在大学的时候都应该掌握的。