当前位置:首页 > 开发 > 编程语言 > 编码 > 正文

drools中文乱码解决

发表于: 2013-08-19   作者:asialee   来源:转载   浏览次数:
摘要:          项目中用到了规则引擎,后来选用了drools开源的实现,后来部署的linux环境后乱码,在本地不乱码,所以第一时间就想到了应该是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

     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>

 

    

           

drools中文乱码解决

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
使用Eclipse编辑文件经常出现中文乱码或者文件中有中文不能保存的问题,Eclipse提供了灵活的设置文
Web项目 Jsp+Tomcat+Mysql乱码解决终极篇 写在之前: 编码出现错误了在web开发的情况下是常常出现的
虚拟机中安装的是中文版的RedHat LINUX AS 4.8,客户端使用putty来连接。 因为linux是中文版的,所
问题描述: 今天在单独js文件中写入了中文字符,测试中发现中文都成了乱码,分别试了下面好几种方式
JFreeChart 中文乱码解决 这篇博文只是对网上关于jfreechart中文乱码解决方法的一个汇总整理。 我也
如下图所示,在执行ping或者cmd.exe命令时,Cygwin出现中文乱码: 解决方案: 在Cygwin终端上右键--
看图说话: 然后查看一下linux系统中的语言设置,执行: vim /etc/sysconfig/i18n 显示成如下图就没
当安装Kscope完成后,然后配置以下三个路径: Cscope path:/usr/bin/cscope Ctags path:/usr/bin/ct
使用ZBarSDK进行二维码解释时出现乱码是因为ZBarSDK在解释时使用的字符集不对,需在ZBarSDK的源码中
遇到中文乱码问题,首先用status命令检查数据库的配置,如下: 上图会显示数据库配置的各项信息。 还
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号