天天看點

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>