• 7274阅读
  • 0回复

【转载】如何转换全角字符到半角字符? [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-07-30
c++ builder:如何转换全角字符到半角字符?  





  我们知道,在windows中,中文和全角字符都占两个字节,并且使用了ascii chart 2 (codes 128–255)。我们可以凭这一点来一个个检测用户输入的是否是中文和全角字符。实际上,全角字符的第一个字
节总是被置为163,而第二个字节则是相同半角字符码加上128(不包括空格)。如半角a为65,则全角a则
是163(第一个字节)、193(第二个字节,128+65)。而对于中文来讲,它的第一个字节被置为大于163
,(如'阿'为:176 162),我们可以在检测到中文时不进行转换。
  以上仅为我个人试验所得,而我更是学习编程不到半月。如果有错误或失漏,请大家不吝赐教。下面
我给出一个例程供大家参考。


  新建窗体,在窗体上放置button1、edit1、edit2。

/*在edit1中输入全角字符、中文、半角字符或混杂输入。
单击button1,edit1中的文字显示到edit2中并转换了所有的全角字符。
注意,程序没有对特殊字符如255(按住alt再按小键盘的2、5、5输入)等作出正确反应。*/
void __fastcall tform1::button1click(tobject *sender)
{
  int nlength=edit1->text.length();
  if (nlength==0)
      return;
  ansistring str="";
  char *ctmp=new char[nlength+1];
  strpcopy(ctmp,edit1->text);
  byte c1,c2;
  int i;
  for (i=0;i<nlength;i++)
  {
      c1=ctmp;
      c2=ctmp[i+1];
      if (c1==163)//判断是否为全角字符
      {

          str=str+ansistring((char)(c2-128));
          i++;
          continue;
      }
      if (c1>163)//判断是否为文字
      {

          str=str+ansistring((char)c1);
          str=str+ansistring((char)c2);
          i++;
          continue;
      }
      if ((c1==161) && (c2==161))//全角空格是个特例,另加处理
          {
            str=str+" ";
            i++;
            continue;
          }
      str=str+ ansistring(char(c1));
  }
  edit2->text=str;
  delete ctmp;ctmp=null;
} 

以上代码c++builder5.0/win98 se下编译通过。                        

                        csdn_light(稻草人)
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个