探讨Java技术,努力学习,分享心得

我不是技术控,拿来主义其实也挺好,但是一定要有自己的想法

统计

留言簿

阅读排行榜

评论排行榜

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的启动
    catalina.bat/
    catalina.sh
    参数里面加上-Dfile.encoding=UTF8

CATALINA_OPTS="-Xmx1024m -Xms1024m -XX:PermSize=256m -XX:MaxPermSize=512m -Xss128k -server -Xdebug -Xnoagent -Djav

a.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8530 -Dfile.encoding=UTF8"


  • 在maven跑junit测试的时候加上这个参数-Dfile.encoding=UTF-8
如果不加这个测试,在junit跑测试的时候还会使用操作系统的默认字符集,会导致测试失败:
                          <plugin>
<artifactId>maven-surefire-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<version>2.11</version>
<configuration>
<argLine>-Dfile.encoding=utf-8</argLine>
<parallel>methods</parallel>  
        <threadCount>10</threadCount>  
<includes>
<include>**/*Test.java</include>
</includes>
<excludes>
<exclude>**/BaseControllerTest.java</exclude>
<exclude>**/BaseTest.java</exclude>
<exclude>**/TestUtils.java</exclude>
</excludes>
</configuration>
</plugin>

这里乱码问题告一段落!





posted on 2015-02-04 15:22 瞿祥军 阅读(5471) 评论(2)  编辑  收藏

评论

# re: Drools中文乱码解决 2015-02-06 09:20 京山游侠

莫非你部署的Linux系统不是采用的UTF-8?
用Java有点不爽的就是有点事就要翻源代码。  回复  更多评论   

# re: Drools中文乱码解决 2016-01-07 09:37 licao

逗B军, wro.xml是干嘛的  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: