一简单有效的解决办法: 对这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(chr(-23116),chr(-23124),chr(-23122),chr(-23120),_ chr(-23118),chr(-23114),chr(-23112),chr(-23110),_ chr(-23099),chr(-23097),chr(-23095),chr(-23075),_ chr(-23079),chr(-23081),chr(-23085),chr(-23087),_ chr(-23052),chr(-23076),chr(-23078),chr(-23082),_ chr(-23084),chr(-23088),chr(-23102),chr(-23104),_ chr(-23106),chr(-23108)) 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(chr(-23116),chr(-23124),chr(-23122),chr(-23120),_ chr(-23118),chr(-23114),chr(-23112),chr(-23110),_ chr(-23099),chr(-23097),chr(-23095),chr(-23075),_ chr(-23079),chr(-23081),chr(-23085),chr(-23087),_ chr(-23052),chr(-23076),chr(-23078),chr(-23082),_ chr(-23084),chr(-23088),chr(-23102),chr(-23104),_ chr(-23106),chr(-23108)) 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(chr(-23116),chr(-23124),chr(-23122),chr(-23120),_ chr(-23118),chr(-23114),chr(-23112),chr(-23110),_ chr(-23099),chr(-23097),chr(-23095),chr(-23075),_ chr(-23079),chr(-23081),chr(-23085),chr(-23087),_ chr(-23052),chr(-23076),chr(-23078),chr(-23082),_ chr(-23084),chr(-23088),chr(-23102),chr(-23104),_ chr(-23106),chr(-23108)) 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 
|