Matthew的Blog

  IT博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
function SbctoDbc(s:string):string;
var
  nlength,i:integer;
  str,ctmp,c1,c2:string;
{
 在windows中,中文和全角字符都占两个字节,
 并且使用了ascii chart 
2  (codes  128 - 255 )。
全角字符的第一个字节总是被置为163,
 而第二个字节则是相同半角字符码加上128(不包括空格)。
 如半角a为65,则全角a则是163(第一个字节)、
193 (第二个字节, 128 + 65 )。
 而对于中文来讲,它的第一个字节被置为大于163,(
 如
' ' 为: 176   162 ),我们可以在检测到中文时不进行转换。
}

begin
  nlength:
= length(s);
  
if  (nlength = 0 ) then
    exit;
  str:
= '' ;
  setlength(ctmp,nlength
+ 1 );
  ctmp:
= s;
  i:
= 1 ;
  
while  (i <= nlength)  do
  begin
    c1:
= ctmp[i];
    c2:
= ctmp[i + 1 ];
    
if  (c1 = # 163 ) then   // 如果是全角字符
    begin
      str:
= str + chr(ord(c2[ 1 ]) - 128 );
      inc(i,
2 );
      
continue ;
    end;
    
if  (c1 > # 163 ) then   // 如果是汉字
    begin
      str:
= str + c1;
      str:
= str + c2;
      inc(i,
2 );
      
continue ;
    end;
    
if  (c1 = # 161 ) and (c2 = # 161 ) then   // 如果是全角空格
    begin
      str:
= str + '   ' ;
      inc(i,
2 );
      
continue ;
    end; 
    str:
= str + c1;
    inc(i);
  end;
  result:
= str;
end;
posted on 2006-04-29 12:45 matthew 阅读(1874) 评论(2)  编辑 收藏 引用 所属分类: Delphi编程

评论

# re: Delphi中实现全角转半角 2006-08-29 18:13 LDT
你这个为什么中文的句号转换不正确呀!  回复  更多评论
  

# re: Delphi中实现全角转半角 2007-01-07 15:18 豆腐干环境看来
标点符号没转  回复  更多评论
  

只有注册用户登录后才能发表评论。