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的編碼
加上這一處編碼還是不行,后來發現我們用的decisiontable的解碼是用的jxl,在網上看,jxl的解析也有可能產生亂碼,于是加上:
給容器啟動的時候設置jxl的編碼
System.setProperty("jxl.encoding", "UTF-8");
加上這兩個系統參數,也是亂碼,經過調試發現,org.drools.rule.builder.dialect.java.JavaDialect類里面的addClassCompileTask方法有將字符超字節轉換的代碼,如下:
加上這兩個系統參數,也是亂碼,經過調試發現,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
<plugin>
這里亂碼問題告一段落!
我們再來看一下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
<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>
這里亂碼問題告一段落!