26个日文片假名导致Access搜索(80040e14/内存溢出)的解决办法

来源:bbs.dvbbs.net  作者:V37
摘要:补充最新修改版,使用Unicode的字符代码,而不是非unicode(负数值,有时会出错)代码Jn0;Jn1;Jn2;Jn3;Jn4;Jn5;Jn6;Jn7;Jn8;Jn9;Jn10;Jn11;Jn12;Jn13;Jn14;Jn15;Jn16;Jn17;Jn1…
解码:

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个片假名最终认定的)

Jn0; 即 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

ァアィイゥウェエォオ
カJn1;キJn2;クJn3;ケJn4;コJn0;
サJn5;シJn6;スJn7;セJn25;ソJn24;
タJn23;チJn22;ッツJn8;テJn9;ト
Jn10;ナニヌネノハJn21;Jn15;ヒ
Jn14;Jn20;フJn19;Jn13;ヘJn12;Jn18;ホJn17;
Jn11;マミムメモャヤュユ
ョヨラリルレロヮワヰ
ヱヲンJn16;ヵヶーヽヾ


================补充 修改的版本===========================

添加一个编码解码参数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

【相关文章】好搜一下
MYSQL初学者使用指南与介绍

MYSQL初学者使用指南与介绍

一、连接MYSQL。格式: mysql -h主机地址 -u用户名 -p用户密码1…