Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2538754
  • 博文数量: 308
  • 博客积分: 5547
  • 博客等级: 大校
  • 技术积分: 3782
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 09:47
个人简介

hello world.

文章分类

全部博文(308)

分类: C/C++

2012-09-28 16:03:50

    因为工作原因,需要对数据库中的数据读取。然后使用socket将内容发送出现。我们大家都知道一般自定义的协议,都会规定发送的最大长度。如果你使用CString::Mid函数,对字符串进行截取。如果你的没有使用程序进行扫描,贸然进行截取,可能会出现乱码。因为如果你的内容中含有中英文,而一个汉字需要使用两个字节进行存储,在这种情况下,你最好的做法,就是定义一个函数,你传递过去你需要传递参数,返回你截取的长度。这样就不会将汉字截成乱码了,其实也是雕虫小计。代码如下:

点击(此处)折叠或打开

  1. int COracleDal::getReadChineseAsciiLength(CString str, int startIndex, int maxLength)
  2. {
  3.     int result = 0;
  4.     int istart = startIndex;
  5.     int iasciivalue = 0;
  6.     int strlength = str.GetLength();
  7.     while(istart < strlength)
  8.     {
  9.         CString cc = str.Mid(istart,1);
  10.         char *p = cc.GetBuffer();
  11.         iasciivalue = (int)(*p); //读取一个字符,获取该字符串的ASCII值
  12.         cc.ReleaseBuffer();
  13.         if(iasciivalue < 0) //当读取字符的ascii的值为负数,则当前位置读取的字符为汉字,
  14.         { //则重新进行对汉字读取,则一次读取两个字符。
  15.             if(result + 2 > maxLength)
  16.                 break;
  17.             cc = str.Mid(istart,2);
  18.             p = cc.GetBuffer();
  19.             iasciivalue = (int)(*p);
  20.          cc.ReleaseBuffer();
  21.             istart += 2;
  22.             result += 2;
  23.         }
  24.         else
  25.         {
  26.             ++istart;
  27.             ++result;
  28.             if(result + 1 > maxLength)
  29.                 break;
  30.         }
  31.     }
  32.     return result;
  33. }

阅读(3245) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~