如何从字符串中提取出汉字(50分)

  • 主题发起人 主题发起人 bluebirds
  • 开始时间 开始时间
B

bluebirds

Unregistered / Unconfirmed
GUEST, unregistred user!
那位英雄知道
如何从包含英文字符、中文标点符号的字符串中提取出所有汉字[?]
感谢100分
 
汉字的字节编码范围为161-255,在此范围内连续的两个字节的可认为是汉字。
(当然也可能是其它土语言)
 
用widestring,判断是否大于127
procedure TForm1.Button1Click(Sender: TObject);
var
str:widestring;
i:integer;
begin
str:='sd,。、f好呀';
for i:=1 to length(str)do
begin
if ord(str)>127 then
edit1.text:=Edit1.text+str;
end;
end;
 
Brave这样做是可以提取出所有的双字节字符,但是也包含了中文下的标点符号,
象“,”,并不是只有汉字。
 
同意westboy2000
只能自已把标点写代码去掉
 
我再补充两句,象BRAVE那样做看每个字符是否大于#127,然后如果大于的话
,再看这半个汉字是否是在str< #$a1 and str>#$a9 之间,一般来说这区间的
字符都是中文的全角标点符号,去掉之后就几乎可以去掉全角的非汉字字符了,不过
还有个别的字符,请查阅WINDOWS ME 的字符集,一看既知道了
 
要看你的字符集, 自己查一下不就可以了?
 
可以使用ByteType(const S : String;Index: Integer):TMbcnByteType 来判断字串中的某
一位置的字符是否为单字节或双字节(如汉字);结果为mbSingleByte时为单字节,可以用
它来简单地字符串中的汉字;
 
例:
汉字由两个字节组成: 且第个字节的asc码大于128
function get_hz(str:string):string;
var i:integer;
begin
i:=1;
while I<=length(str)do
begin
if s>chr(127) then
begin
result:=result+str+str[i+1]);
i:=i+1;
end
else
result:=result+s;
i:=i+1;
end;
end;
上面的代码可能有点问题(是我随手写的没有测试)不过主要过程有了
其它的你自已改改就行了
 
把英文剔掉,剩下的不就是啦。
英文总比中文好判断吧。(大不了把127以下的都搞出来,作个枚举型)
 
for i := Length(aStr)do
wnto 1do
if Ord(aStr) < 128 then
Delete(aStr, i, 1);
Result := aStr;
 
后退
顶部