读书人

drools汉语言乱码解决

发布时间: 2013-11-08 17:52:14 作者: rapoo

drools中文乱码解决

? ? ? ? ?项目中用到了规则引擎,后来选用了drools开源的实现,后来部署的linux环境后乱码,在本地不乱码,所以第一时间就想到了应该是drools内部取了操作系统默认的编码了。

? ? ? ? ?首先我们知道,凡是乱码基本上是字节和字符之间相互转换的时候出现的,经过仔细排查,发现将规则文件加入到session里面的时候没有给编码,于是加上。

?加载规则文件的时候必须指定编码,比如UTF-8
中文乱码代码:Reader reader = new FileReader(new File("F:/WorkFolder/drools/drl/addpoint.drl"));解决方法:Reader reader = new InputStreamReader(new FileInputStream("F:/WorkFolder/drools/drl/addpoint.drl"),"UTF-8");
?加上这一处编码还是不行,后来发现我们用的decisiontable的解码是用的jxl,在网上看,jxl的解析也有可能产生乱码,于是加上给容器启动的时候设置jxl的编码
System.setProperty("jxl.encoding", "UTF-8");
?加上这两个系统参数,也是乱码,经过调试发现,org.drools.rule.builder.dialect.java.JavaDialect类里面的addClassCompileTask方法有将字符超字节转换的代码,如下:
 public void addClassCompileTask(final String className,                                     final BaseDescr descr,                                     final String text,                                     final MemoryResourceReader src,                                     final ErrorHandler handler) {        final String fileName = className.replace( '.',                                                   '/' ) + ".java";        try {         if (src != null) {                 src.add( fileName,                          text.getBytes() );             } else {                 this.src.add( fileName,                               text.getBytes() );             }        } catch (final UnsupportedEncodingException e ) {           throw new RuntimeException("unable to encoding the rule!");        }               this.errorHandlers.put( fileName,                                handler );        addClassName( fileName );    }
?我们再来看一下String的getBytes方法的实现,这个方法里面默认取平台的编码的,至此,我们就知道病根了,所以比较简单了,加上-Dfile.encoding=UTF8参数就可以了,注意,这个地方是UTF8,不是UTF-8,具体的解释看官方文档:?http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html,最后这个也是在tomcat的启动参数里面加上-Dfile.encoding=UTF8在tomcat的启动参数里面加上-Dfile.encoding=UTF8

? ? ? ? ? ?

读书人网 >编程

热点推荐