文章·资料 电脑软件 手机软件 网站源码




    本 站 搜 索
   推 荐 文 章        More...
华硕易电脑(ASUS Eee PC 10..
先来段开场白:为了外出携带方便..
Acronis True Image 使用..
  一款可以在Windows下使用..
Norton Ghost 使用详解
一、分区备份   使用Ghost..
    文 章 阅 读 排 行
“啊估文章软件站”网站系..
一、调试测试网站系统时,如何..
关于 Firefox 在中国持续..
亲爱的 Firefox 用户及 Firefox..
向日葵远程控制软件,设置..
向日葵远程控制软件有个人版和..
夸克网盘新用户注册如何获..
夸克网盘,新用户注册如何获得1..
FileZilla Server 设置参考
FileZilla Server 启动界面 ..
PakePlus 构建 APP 需要 Gi..
PakePlus 是一个基于 Rust Taur..
电脑显示器使用 HDMI 数据..
如果电脑显示器使用 HDMI 数据..
ASP/JavaScript:不刷新页..
function GuReturnElement(..
分享几个免费申请 SSL 证..
DigiCert 原 Symantec(赛门铁..
关闭微信的个性化推荐广告
有网友说到,微信的初衷是拉近..
 文 章 信 息
26个日文片假名导致Access搜索(80040e14/内存溢出)的解决办法
评论()〗〖留言〗〖收藏
〖文章分类:电脑·手机·网络 / 网站设计·开发·优化〗〖阅读选项


补充最新修改版,使用Unicode的字符代码,而不是非unicode(负数值,有时会出错)代码 
ゴ ガ ギ グ ゲ ザ ジ ズ ヅ デ ド ポ ベ プ ビ パ ヴ ボ ペ ブ ピ バ ヂ ダ ゾ ゼ 
当字段内包含了这26个日文字符任意一个多个时,就会导致在执行SQL语句中包含了
[字段] like ’%aaaaa%’ 或 inStr(1,[字段],’aaaaa’,1)>0
这样的查询时,毫无道理的出现了
"Microsoft JET Database Engine 错误 ’80040e14’ 内存溢出"的错误
其他Jet SQL函数命令未作测试,大概与字符搜索定位匹配相关的都可能出错
搜索相关资料得知被微软工程师证实是Access的bug,可能是语法关系都是微软的东东
在vbs中 执行inStr(1,日文平假名变量,"aaaaa",1)依然要出现错误
Microsoft VBScript 运行时错误 错误 ’800a0005’ 无效的过程调用或参数: ’instr’ 

没有搜索,因这几个字符出现Access的论坛网站搜索无法进行,何等痛苦
昨天一朋友大叫怪事,他的音乐数据库无法搜索了,只有30000条记录时是好的
毫无疑问,日文片假名是祸根,花几分钟把有包含上面的日文替换成"?"搜索顺利恢复
找来论坛程序用户群最大的动网dvBBS AC版本 7.0SP2 版测试,同样有这个日文发帖后 导致无法搜索并且运行时出错的问题
线上去搜索 ’80040e14’ 内存溢出" 的错误 多的是!
一简单有效的解决办法:
对这26个字符进行编码和解码,可能效率感觉不理想,测试下来问题不大,速度影响不是太大
编码:
Function Jencode(byVal iStr)
if isnull(iStr) or isEmpty(iStr) then
  Jencode=""
  Exit function
end if
dim F,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
  for i=0 to 25
   Jencode=replace(Jencode,F(i),E(i))
  next
End Function
解码:
Function Juncode(byVal iStr)
if isnull(iStr) or isEmpty(iStr) then
  Juncode=""
  Exit function
end if
dim F,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
for i=0 to 25
  Juncode=replace(Juncode,E(i),F(i))’□
next
End Function
注意,如果直接使用字符不方便(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
unicode 3040-309F 
ぁあぃいぅうぇえぉお
かがきぎくぐけげこご
さざしじすずせぜそぞ
ただちぢっつづてでと
どなにぬねのはばぱひ
びぴふぶぷへべぺほぼ
ぽまみむめもゃやゅゆ
ょよらりるれろゎわゐ
ゑをん゛゜ゝゞ
------------------------------
片假名89个 asc值 
-23135 -> -23059
unicode 30A0-30FF
ァアィイゥウェエォオ
カガキギクグケゲコゴ
サザシジスズセゼソゾ
タダチヂッツヅテデト
ドナニヌネノハバパヒ
ビピフブプヘベペホボ
ポマミムメモャヤュユ
ョヨラリルレロヮワヰ
ヱヲンヴヵヶーヽヾ

================补充 修改的版本===========================
添加一个编码解码参数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 ’显示到页面的标题
Function Jncode(byVal iStr,codeType)
if isnull(iStr) or isEmpty(iStr) or iStr="" then
  Jncode="" : Exit function
end if
dim F,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))
if codyType then
   for i=0 to 25 iStr=replace(iStr,F(i),E(i)) next
else
   for i=0 to 25 iStr=replace(iStr,E(i),F(i)) next
end if
Jncode=iStr
End Function


文章作者:未知  更新日期:2006-09-18
〖文章浏览:〗〖发送文章〗〖打印文章
〖文章阅读说明〗
·本站大部分文章转载于网络,如有侵权请留言告知,本站即做删除处理。
·本站法律法规类文章转载自[中国政府网(www.org.cn)],相关法律法规如有修订,请浏览[中国政府网]网站。
·本站转载的文章,不为其有效性,实效性,安全性,可用性等做保证。
·如果有什么问题,或者意见建议,请联系[网站管理员]。