delphi的bug ,气的吐血(100分)

  • 主题发起人 主题发起人 rwlin
  • 开始时间 开始时间
R

rwlin

Unregistered / Unconfirmed
GUEST, unregistred user!
添加一个按钮,输入;
ShowMessage(IntToStr(Pos('一', '我会被气的吐血')));

猜到结果了吗?
delphi字节处理的问题,编程这么多年,居然没发现,真丢脸,哈哈
现在只能加上校验啦..
 
哈哈,结果是2吧,顶一个。
 
一般人咱不告诉他,哈哈..
 
ShowMessage(IntToStr(Pos(WideString('一'), WideString('我会被气的吐血'))));
ShowMessage(IntToStr(Pos(WideString('一'), WideString('我会被一气的吐血'))));
------------------------
可以说不是Bug只是编程使用的问题 用宽字节不就得了,你这样用会有问题的
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2485309
 
To jfyes:
用这两句编译后,瑞星竟然当病毒了
 
用宽字节确实是一个解决方法,但搜索效率降低了很多,尤其是大文本的时候;
如果是中英文数字混排,将单字节的数字字母都转换成双字节,效率??
而delphi的pos 和posex 参数默认的也是string,而非widestring;估计也是没考虑双字节的问题把,呵呵
 
to:guqiu
两句就写出一个病毒,哈哈...
 
瑞星超强,jfyes也不错哈,两句就整一个病毒出来
 
呵呵,不知道为什么会当病毒,提示病毒名:Trojan.DL.Win32.Banload.chy
 
你还用瑞星
哈哈
大量的,用POS没有办法了,
如果是海量的,可以分词索引,查找就快了
 
delphi的string没有用unicode导致的 严格说不是bug吧
 
Pos有两个Overload版本.
你这样就行了
ShowMessage(IntToStr(Pos(WideString('一'), WideString('我会被气的吐血'))));
 
to wr960204:
转化成widestring 只能勉强算是一种方法;
还有一种情况,就是在不使用pos,而必须使用posex的时候;用widestring也失效了,也就是
ShowMessage(IntToStr(Posex(WideString('一'), WideString('我会被气的吐血'),1)));
结果依然是2
吐血不吐血.哈哈
 
上面这种情况,要妥协的话,只能将delphi 自带的posex 参数类型稍微修改一下才可以,不能用默认的.
 
这不是Bug,是编成习惯不不严谨
Pos 和 Posex 默认参数都是 String,而非 WideString
String 和 WideString类型其实都是对象,他们的起始地址的偏移量不同
 
既然是不严谨,不是bug,那你怎么解释
ShowMessage(IntToStr(Posex(WideString('一'), WideString('我会被气的吐血'),1)));
=2
呵呵..
 
“一我会”的16进制:D2 BB CE D2 BB E1
所以你用ansistring查询子串,自然会产生这样的问题,这样的汉字组合应该不止这样一组,不算bug。
 
鉴定完毕。
 
这么快就鉴定完毕了?哈哈
原理大家都知道..关键是看什么有什么好方法,呵呵,单单用widestring是不够的...
字符串匹配太常用了..
大家都习惯性的用pos就了事,,没仔细去琢磨..
 
我 会
206 210 187 225
|_______|

用string 会按照每个字节匹配;
用widestring可以按双字节进行匹配;如果这时候用pos,不会出现这个问题了.但这个时候如果用posex 又会出现这个问题;因为posex的参数默认是string类型;
所以需要自己稍微改动一下posex的参数类型为widestring;
所以最终正确的匹配方法就是用widestring + posex(修改) ..

看看大家有没有什么更好的方法,,,继续探讨探讨....
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部