delphi处理特殊汉字的问题请教,各位大哥帮忙!(100分)

  • 主题发起人 主题发起人 woainin
  • 开始时间 开始时间
W

woainin

Unregistered / Unconfirmed
GUEST, unregistred user!
今天发现一个问题,如下:<br>temp:='|珅|';<br>&nbsp; &nbsp; &nbsp;StrLen:=Length(temp);<br>&nbsp; &nbsp; &nbsp;for k:=1 to StrLen do<br>&nbsp; &nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if Copy(temp,k,1)='|' then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Num:=Num+1;<br>&nbsp; &nbsp; &nbsp; &nbsp;end;<br>到最后num的值应该为2,但是运行后实际为3了,如果把‘|珅|’改成别的如:‘|亿|’则num的值为2,'|億|'也是同样的问题,我查了下,坤是双字节的,后字节的acsii码跟‘|’相同,所以会出现以上情况,但是这个情况我们不能避免,请问怎么来处理呢?<br>谢谢各位大哥了!
 
CharNext &nbsp; &nbsp; &nbsp; &nbsp; (the String's CodePage must be same with system local)<br>or use Unicode
 
先用ByteType函数判断一下,是单字节字符还是双字节字符;详情查帮助;
 
procedure TForm1.Button1Click(Sender: TObject);<br>var i,c:Integer;<br>begin<br>&nbsp; c:=Length('|亿ab中|');<br>&nbsp; for i:=1 to c-1 do<br>&nbsp; begin<br>&nbsp; &nbsp; ShowMessage(MidStr('|亿ab中|',i,1));<br>&nbsp; end;<br>end;<br>主要的问题在于Length这个函数,它是把双字节的长度算作2,所以,你只能在For循环的时候进行处理把取到为空的跳过
 
但是‘|亿|’正常,'|珅|'就不正常了。<br>HJ.Yao兄弟说的也没错,但是如果我的文件里本来有两个连续的||就不好办了,如:<br>|亿|||ab中||珅|||
 
To 楼主:<br>给你写了个函数,应该没问题:<br>var<br>&nbsp; s: string;<br>&nbsp; p: PChar;<br>&nbsp; num: Integer;<br>&nbsp; fareast: Boolean;<br>begin<br>&nbsp; s := '|亿|||ab中||珅|||';<br>&nbsp; p := PChar(s);<br>&nbsp; num := 0;<br>&nbsp; fareast := False;<br>&nbsp; while p^ &lt;&gt; #0 do<br>&nbsp; begin<br>&nbsp; &nbsp; if fareast then fareast := False<br>&nbsp; &nbsp; else if Byte(p^) &gt;= 160 then fareast := True<br>&nbsp; &nbsp; else if p^ = '|' then Inc(num);<br>&nbsp; &nbsp; Inc(p);<br>&nbsp; end;<br>&nbsp; ShowMessage(IntToStr(num));<br>end;<br>应该弹出对话框“9”,另外比你自己写的快 30 倍。字符串的比较一定要用指针,Copy 什么的效率极低!
 
谢谢vvyang兄,<br>我明天试试看,其实我的应用比我描述的要复杂很多我只是把它抽象了下,<br>谢谢啊!
 
To woainin:<br>能用就揭帖,不能用就说话。
 
楼主,您以为 100 分很多么?能用就结帖,不能用说一声,实在不行我倒找你 300 分!
 
建议使用unicode<br>widestring来解决这一问题
 
TO woainin: 先把分给vvyang!<br>用 WideString就是了<br><br>var<br>&nbsp; temp: WideString;<br>begin<br>&nbsp; temp:='|珅|';<br>&nbsp; &nbsp; &nbsp;StrLen:=Length(temp);<br>&nbsp; &nbsp; &nbsp;for k:=1 to StrLen do<br>&nbsp; &nbsp; &nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if temp[k]='|' then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Num:=Num+1;<br>&nbsp; &nbsp; &nbsp; &nbsp;end;
 
widestring是正解
 
//修改xjsd12的方法<br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; temp: WideString;<br>&nbsp; StrLen:word;<br>&nbsp; Num,k:integer;<br>begin<br>&nbsp; temp:='|珅|';<br>&nbsp; StrLen:=Length(temp);<br>&nbsp; Num:=0;<br>&nbsp; for k:=1 to StrLen do<br>&nbsp; begin<br>&nbsp; &nbsp;if temp[k]='|' then<br>&nbsp; &nbsp; &nbsp; &nbsp;Num:=Num+1;<br>&nbsp; end;<br>&nbsp; caption:=inttostr(Num);<br>end;
 
WideString支持Unicode 支持双字节<br>用WideString是正解.
 
支持:widestring是正解
 
你到以下地址去找找,可能找得到你需要的答案。<br>http://iinsnian.cnblogs.com/<br>http://del.cnblogs.com/ <br>这两个地址里介绍了很多DELPHI的技巧,不知道你的运气好不好。
 
直接使用 AnsiPos 即可
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部