急!delphi2010的字符串处理的问题(25)

  • 主题发起人 主题发起人 青云
  • 开始时间 开始时间

青云

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi的中文处理,一直就不是很顺畅,如今我又发现一个问题在delphi2010环境下:比如:以下16进制的字符拼起来的字符时,9D 68 D5 5A 33 BD F0 BD F0 BD在windwos xp 下显示:漢語3金金在 windows 7 下显示:漢語3金金? 执行下面代码:procedure TForm1.Button1Click(Sender: TObject); var Str: ansiString;begin str:=ansiChar($9D) +ansiChar($68) +ansiChar($D5) +ansiChar($5A)+ ansiChar($33) +ansiChar($BD) +ansiChar($F0) +ansiChar($BD)+ ansiChar($F0 )+ ansiChar($BD); edit1.text:=str;end;你会发现在 win7 下最后会多个问号;这个转换问题很麻烦,我用的一个控件原来在winxp下一直好好的,发现到win7下,经常发现把半个中文搞成问号;而在winxp下,半个中文会自动被截掉;而且我还发现一个问题:以上这段代码,放在delphi7下编译后,即使放在win7环境下,也不会出现最后的问号;也就是说只有在 win7+delphi2010这个组合下,才有此问题。希望朋友能提供修正方法;
 
http://bbs.2ccc.com/topic.asp?topicid=360224http://atkins.5d6d.com/thread-18224-1-1.html
 
你把后面加个#0,这样:str := ...+ ansiChar($BD) + #0;另外,很少这样去组合字符串的。
 
我仔细看了一下,你多加了一个字节,把最后的$BD去掉。另外,这样写:str:=#$9D#$68#$D5#$5A#$33#$BD#$F0#$BD#$F0;
 
您的方法我测试过了,没用: var Str: ansiString;begin str:=ansiChar($9D) +ansiChar($68) +ansiChar($D5) +ansiChar($5A)+ ansiChar($33) +ansiChar($BD) +ansiChar($F0) +ansiChar($BD)+ ansiChar($F0 )+ ansiChar($BD)+#0; edit1.text:=str;end;我这是通过这个例子说明一个现象,程序当然不会怎么写;但是在win7里面的delphi2010开发的程序,会导致显示中文出现'?'原因就是可以通过上面这个代码来解释。
 
我上面的第二个回复看到没?多了个字节了
 
我仔细看了一下,你多加了一个字节,把最后的$BD去掉。另外,这样写:str:=#$9D#$68#$D5#$5A#$33#$BD#$F0#$BD#$F0; --故意多加了一个字节,是“金”字的第一个字节;但是在非win7的操作系统下,delphi2010会自动截掉的;这么说吧: 在 delphi2010+win7的组合下,汉字只有第一个字节的话,string不会自动截掉;而其他任何组合,比如delphi7+win7, delphi2010+winxp 等,都会自动截掉;
 
我不太明白你说的但字符串处理和操作系统无关
 
首先要明确1、你说的Win7+Delphi2010所显示的错误结果才是正确的。2、你的需求是:如果最后一个字符是双字节字符的前半个则忽略掉。方案很多,简单的办法是用ByteType函数判断最后一个字符是否为mbLeadByte,如果是截掉就是了
 
还是给你写个例程吧:procedure TForm1.Button1Click(Sender: TObject);var Chs: TBytes; iL, I: Integer; S: AnsiString;begin SetLength(Chs, 10); Chs[0] := $9D; Chs[1] := $68; Chs[2] := $D5; Chs[3] := $5A; Chs[4] := $33; Chs[5] := $BD; Chs[6] := $F0; Chs[7] := $BD; Chs[8] := $F0; Chs[9] := $BD; S := ''; iL := Length(Chs); if iL > 0 then begin if ByteType(AnsiChar(Chs[iL - 1]), 1) = mbLeadByte then SetLength(Chs, iL - 1); for I := Low(Chs) to High(Chs) do S := S + AnsiChar(Chs); end; Caption := S;end;没有环境测试,应该没问题。
 
一切DOS环境都不会自动截断尾部的半个汉字的,再windowsXP,98财这样处理,后来Win7又恢复了以前的方法了,这个有什么问题呢?很正常啊!
 
MAGXJ500T提供的 if ByteType(AnsiChar(Chs[iL - 1]), 1) = mbLeadByte then SetLength(Chs, iL - 1);是有效的,刚测试成功。
 
后退
顶部