ASP网页编程之26个日文片化名招致Access搜刮(80040e1...
对于中小型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里
wherelike%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语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况; 弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。 你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。 封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高。 Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名") 掌握asp的特性而且一定要知道为什么。 虽然ASP也有很多网络教程。但是这些都不系统。都是半路出家,只是从一个例子告诉你怎么用。不会深入讨论,更不会将没有出现在例子里的方法都一一列举出来。 跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组 跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组 跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组
页:
[1]