仓酷云

标题: ASP网页编程之26个日文片化名招致Access搜刮(80040e1... [打印本页]

作者: 简单生活    时间: 2015-1-16 22:11
标题: 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里
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语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况;
作者: 小魔女    时间: 2015-1-18 22:08
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
作者: 飘灵儿    时间: 2015-1-25 12:52
你可以通过继承已有的对象最大限度保护你以前的投资。并且C#和C++、Java一样提供了完善的调试/纠错体系。
作者: 仓酷云    时间: 2015-2-2 22:09
封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变,业务逻辑代码都不必做任何改动;继承性和多态性使得代码的可重用性大大提高。
作者: 再见西城    时间: 2015-2-25 12:08
Request:从字面上讲就是“请求”,因此这个是处理客户端提交的东东的,例如Resuest.Form,Request.QueryString,或者干脆Request("变量名")
作者: 深爱那片海    时间: 2015-3-7 21:21
掌握asp的特性而且一定要知道为什么。
作者: 乐观    时间: 2015-3-15 14:53
虽然ASP也有很多网络教程。但是这些都不系统。都是半路出家,只是从一个例子告诉你怎么用。不会深入讨论,更不会将没有出现在例子里的方法都一一列举出来。
作者: 第二个灵魂    时间: 2015-3-22 02:10
跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组
作者: admin    时间: 2015-3-22 02:10
跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组
作者: 飘飘悠悠    时间: 2015-3-22 02:10
跟学别的语言一样,先掌握变量,流程控制语句(就是ifwhileselect)等,函数/过程,数组




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2