探討Java技術(shù),努力學(xué)習(xí),分享心得

          我不是技術(shù)控,拿來主義其實(shí)也挺好,但是一定要有自己的想法

          統(tǒng)計

          留言簿

          閱讀排行榜

          評論排行榜

          Drools中文亂碼解決

               項(xiàng)目中用到了規(guī)則引擎,后來選用了drools開源的實(shí)現(xiàn),后來部署的linux環(huán)境后亂碼,在本地不亂碼,所以第一時間就想到了應(yīng)該是drools內(nèi)部取了操作系統(tǒng)默認(rèn)的編碼了 。凡是亂碼基本上是字節(jié)和字符之間相互轉(zhuǎn)換的時候出現(xiàn)的,經(jīng)過仔細(xì)排查,發(fā)現(xiàn)將規(guī)則文件加入到session里面的時候沒有給編碼,于是加上。

          加載規(guī)則文件的時候必須指定編碼,比如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");

          加上這一處編碼還是不行,后來發(fā)現(xiàn)我們用的decisiontable的解碼是用的jxl,在網(wǎng)上看,jxl的解析也有可能產(chǎn)生亂碼,于是加上:
          給容器啟動的時候設(shè)置jxl的編碼
          System.setProperty("jxl.encoding", "UTF-8");

          加上這兩個系統(tǒng)參數(shù),也是亂碼,經(jīng)過調(diào)試發(fā)現(xiàn),org.drools.rule.builder.dialect.java.JavaDialect類里面的addClassCompileTask方法有將字符超字節(jié)轉(zhuǎn)換的代碼,如下:
          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方法的實(shí)現(xiàn),這個方法里面默認(rèn)取平臺的編碼的,至此,我們就知道病根了,所以比較簡單了,加上-Dfile.encoding=UTF8參數(shù)就可以了。注意,這個地方是UTF8,不是UTF-8,具體的解釋看官方文檔: http://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html,最后這個也是在tomcat的啟動參數(shù)里面加上-Dfile.encoding=UTF8
          • 在tomcat的啟動
            catalina.bat/
            catalina.sh
            參數(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測試的時候加上這個參數(shù)-Dfile.encoding=UTF-8
          如果不加這個測試,在junit跑測試的時候還會使用操作系統(tǒng)的默認(rèn)字符集,會導(dǎo)致測試失敗:
                                    <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 瞿祥軍 閱讀(5572) 評論(2)  編輯  收藏

          評論

          # re: Drools中文亂碼解決 2015-02-06 09:20 京山游俠

          莫非你部署的Linux系統(tǒng)不是采用的UTF-8?
          用Java有點(diǎn)不爽的就是有點(diǎn)事就要翻源代碼。  回復(fù)  更多評論   

          # re: Drools中文亂碼解決 2016-01-07 09:37 licao

          逗B軍, wro.xml是干嘛的  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 海淀区| 嘉黎县| 宁化县| 彭州市| 荆门市| 改则县| 甘南县| 福贡县| 望谟县| 独山县| 印江| 古交市| 铁岭市| 奉化市| 高清| 安多县| 林周县| 宜州市| 西充县| 夏津县| 松阳县| 车致| 长葛市| 五寨县| 白河县| 公安县| 黄大仙区| 阳西县| 文化| 荆门市| 特克斯县| 兴宁市| 阳高县| 苏州市| 盐边县| 雷波县| 江华| 女性| 漾濞| 尖扎县| 司法|