|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于中小型web应用来说,php有很强的竞争力,linux+apache+mysql+php(lamp)的组合几乎可以胜任绝大多数网站的解决方案,对于大型应用来讲,对于系统架构要求更高,需要有成熟的框架支持,jsp的struts是个不错的框架,国内介绍它的资料也非常多,应用逐渐广泛起来。asp就不用说了,access|办理增补最新修正版,利用Unicode的字符代码,而不长短unicode(正数值,偶然会堕落)代码ゴガギグゲザジズヅデドポベプビパヴボペブピバヂダゾゼ
当字段内包括了这26个日笔墨符恣意一个多个时,就会招致在实行SQL语句中包括了
[字段]like%aaaaa%或inStr(1,[字段],aaaaa,1)>0
如许的查询时,毫无事理的呈现了
"MicrosoftJETDatabaseEngine毛病80040e14内存溢出"的毛病
其他JetSQL函数命令未作测试,也许与字符搜刮定位婚配相干的都大概堕落
搜刮相干材料得知被微软工程师证明是Access的bug,多是语法干系都是微软的东东
在vbs中实行inStr(1,日文平化名变量,"aaaaa",1)仍然要呈现毛病
MicrosoftVBScript运转时毛病毛病800a0005有效的历程挪用或参数:instr
没有搜刮,因这几个字符呈现Access的论坛网站搜刮没法举行,多么疾苦
今天一伴侣大呼怪事,他的音乐数据库没法搜刮了,只要30000笔记录时是好的
毫无疑问,日文片化名是祸端,花几分钟把有包括下面的日文交换成"?"搜刮顺遂恢复
找来论坛程序用户群最年夜的动网dvBBSAC版本7.0SP2版测试,一样有这个日文发帖后招致没法搜刮而且运转时堕落的成绩
线上往搜刮80040e14内存溢出"的毛病多的是!
一复杂无效的办理举措:
对这26个字符举行编码息争码,大概效力感到不睬想,测试上去成绩不年夜,速率影响不是太年夜
编码:
FunctionJencode(byValiStr)
ifisnull(iStr)orisEmpty(iStr)then
Jencode=""
Exitfunction
endif
dimF,i,E
E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;","Jn7;","Jn8;",
"Jn9;","Jn10;","Jn11;","Jn12;","Jn13;","Jn14;","Jn15;","Jn16;","Jn17;",
"Jn18;","Jn19;","Jn20;","Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_
chrw(12466),chrw(12470),chrw(12472),chrw(12474),_
chrw(12485),chrw(12487),chrw(12489),chrw(12509),_
chrw(12505),chrw(12503),chrw(12499),chrw(12497),_
chrw(12532),chrw(12508),chrw(12506),chrw(12502),_
chrw(12500),chrw(12496),chrw(12482),chrw(12480),_
chrw(12478),chrw(12476))
Jencode=iStr
fori=0to25
Jencode=replace(Jencode,F(i),E(i))
next
EndFunction
解码:
FunctionJuncode(byValiStr)
ifisnull(iStr)orisEmpty(iStr)then
Juncode=""
Exitfunction
endif
dimF,i,E
E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;","Jn7;","Jn8;","Jn9;",
"Jn10;","Jn11;","Jn12;","Jn13;","Jn14;","Jn15;","Jn16;","Jn17;","Jn18;",
"Jn19;","Jn20;","Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_
chrw(12466),chrw(12470),chrw(12472),chrw(12474),_
chrw(12485),chrw(12487),chrw(12489),chrw(12509),_
chrw(12505),chrw(12503),chrw(12499),chrw(12497),_
chrw(12532),chrw(12508),chrw(12506),chrw(12502),_
chrw(12500),chrw(12496),chrw(12482),chrw(12480),_
chrw(12478),chrw(12476))
Juncode=iStr
fori=0to25
Juncode=replace(Juncode,E(i),F(i))□
next
EndFunction
注重,假如间接利用字符不便利(windows还没装日文撑持),正文失落的部分供应有chr(-23804)
..如许的界说
如许
1.
表单输出保留时,利用Jencode()将这26个字符先编码再保留(为何是这26个字符,
经由全体测试87个平化名89个片化名终极认定的)
如
ゴ即chr(-23116)编码为Jn1;
2.
显现时,则利用Juncode()函数举行解码,复原日文片化名显现
3.
搜刮关头字,也要利用Jencode()举行编码后再放进like里
where[Topic]like%Jencode(kewwords)%利用
才干包管搜刮的值和编码过的数据库字段内容婚配
==================================
PS:
也能够利用正则表达式来改写下面的两个函数,也许效力还要更高些
再就是假如压根不利用日文,也不必要搜刮日文,则解码部分能够不必,
保留数据实间接把这26个片化名字符交换为空字符或任一字符,好比"□"
举一反三,假如有更实质的真实的好办法,谢分享
附:
----------------------------
平化名87个asc值
-23391-->-23316
unicode3040-309F
ぁあぃいぅうぇえぉお
かがきぎくぐけげこご
さざしじすずせぜそぞ
ただちぢっつづてでと
どなにぬねのはばぱひ
びぴふぶぷへべぺほぼ
ぽまみむめもゃやゅゆ
ょよらりるれろゎわゐ
ゑをんabfg
------------------------------
片化名89个asc值
-23135->-23059
unicode30A0-30FF
ァアィイゥウェエォオ
カガキギクグケゲコゴ
サザシジスズセゼソゾ
タダチヂッツヅテデト
ドナニヌネノハバパヒ
ビピフブプヘベペホボ
ポマミムメモャヤュユ
ョヨラリルレロヮワヰ
ヱヲンヴヵヶ`cd
================增补修正的版本===========================
增加一个编码解码参数codeType
都利用一个函数
利用chr()不间接利用日笔墨符
如许~够简便了吧?
疑点:显现日文是不会堕落的,保留到数据库也不会堕落
只要SQL利用like和inStr的时分才会堕落这个与显现有关!
另有在vbs里利用inStr(1,str,"aaa",1)如许按字符搜刮也会错
改成inStr(lcase(str),"aaa")就不会堕落
假如必定得用inStr(1,str,"aaa",1)字符搜刮语法
则必定要在先inStr()后jncode()的按次不然会堕落
一点成绩都没有!注重到这几点相对没错!
rs("TopicStr")=Jncode(TopicStr,true)encode保留到数据库的材料
DisplayStr=Jncode(rs("TopicStr"),false)uncode显现到页面的题目
FunctionJncode(byValiStr,codeType)
ifisnull(iStr)orisEmpty(iStr)oriStr=""then
Jncode="":Exitfunction
endif
dimF,i,E
E=array("Jn0;","Jn1;","Jn2;","Jn3;","Jn4;","Jn5;","Jn6;",_
"Jn7;","Jn8;","Jn9;","Jn10;","Jn11;","Jn12;","Jn13;",_
"Jn14;","Jn15;","Jn16;","Jn17;","Jn18;","Jn19;","Jn20;",_
"Jn21;","Jn22;","Jn23;","Jn24;","Jn25;")
F=array(chrw(12468),chrw(12460),chrw(12462),chrw(12464),_
chrw(12466),chrw(12470),chrw(12472),chrw(12474),_
chrw(12485),chrw(12487),chrw(12489),chrw(12509),_
chrw(12505),chrw(12503),chrw(12499),chrw(12497),_
chrw(12532),chrw(12508),chrw(12506),chrw(12502),_
chrw(12500),chrw(12496),chrw(12482),chrw(12480),_
chrw(12478),chrw(12476))
ifcodyTypethen
fori=0to25iStr=replace(iStr,F(i),E(i))next
else
fori=0to25iStr=replace(iStr,E(i),F(i))next
endif
Jncode=iStr
EndFunction
由于ASP还是一种Script语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况; |
|