Pentaho CDE 亂碼問題解決

相信在使用Pentaho CDE的時候亂碼問題讓很多人很頭疼哭
經過長時間的調試和源碼閱讀終於找到了解決亂碼的方法下面和大家分享一下!
1、導致亂碼的原因:
    爲什麼會出現亂碼呢,是因爲數據在傳遞的時候編碼不一致,那麼解決的方法就是找到哪個地方的編碼和別的地方的不一致(找到這一點很關鍵)
2、Pentaho CDE 亂碼的現像
     通過 CDE生成的Dashboard 在Pentaho BIServer中瀏覽或展示時會出現亂碼,而用CDE自己的API獲取的HTML內容是不會亂碼的。
注: 可能通過http://IP:PORT/pentaho/plugin/pentaho-cdf-dd/api/renderer /getContent?solution=home&path=admin&file=demo1.wcdf查看CDE生成的HTML 內容
      可以通過http://IP:
PORT/pentaho/plugin/pentaho-cdf-dd/api/renderer/render?solution=home&path=admin&file=demo1.wcdf&root=IP:PORT查看CDE生成的整個頁面
3、查找原因
     根據2中的現像很有可能是CDE中的編碼和Pentaho BIServer中的編碼不一致,經過分析和查看源碼發現 CDE中的編碼爲utf-8(通過硬編碼的可以在)而Pentaho BIServer 默認的編碼也是utf-8,並且我已經顯式的設置成了utf-8,顯然CDE和Pentaho BIServer的編碼是一致的,這樣問題的範圍縮小很多了,可以斷定數據在CDE中沒有亂碼如果CDE直接傳給Pentaho BIServer也不會亂碼(因爲CDE和Pentaho BIServer的編碼上一致的),那麼亂碼的可能就是數據從CDE傳遞到Pentaho BIServer的時候用不是直接傳遞的而是通過別的工具類或在這之前進行了轉換。通過查看源碼發現:

CDE pt.webdetails.cdf.dd.DashboardDesignerContentGenerator類的createContent方法中將從CDE生成的HTML內容傳遞到了Pentaho中(通過Response傳過去的)。但是CDE用的是 org.apache.commons.io.IOUtils.write(String str,OutputStream st)方法將CDE生成的內容寫到Respose輸出流

問題就在這裏
IOUtils.write(String str,OutputStream st) 這個方法用到了java.io包下的類它們的編碼是由JVM中的file.encoding決定的查看file.encoding的編碼爲GBK(其實IOUtils.write 還有一個重載方法IOUtils.write(String str,OutputStream st,String encoding)如果用這個方法就可以設置寫入流時的編碼格式而不使用file.encoding中的值但是CDE沒有使用這個方法
4、解決方法
   問題已經找到那麼解決方法也就出來了這裏有兩種解決方法
   解決方法一、將file.encoding的值由GBK改爲utf-8具體方法 在Tomcat的catalina.bat(linux 爲catalina.sh)的JAVA_OPTS中加入-Dfile.encoding 設置爲 set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8(
僅windows
  解決方法二、重寫DashboardDesignerContentGenerator類的createContent方法IOUtils.write(result, getResponse().getOutputStream());換成IOUtils.write(result, getResponse().getOutputStream(),getResponse().getCharacterEncoding());

OK、到這裏CDE的亂碼問題已經解決 來一個效果圖:



 

 

 

本人接觸Pentaho時間不長如果文中有錯誤望高手指出謝謝!

如果對文中有疑問請聯繫我

我的Email:[email protected]

我的博客:http://alenzhai.iteye.com/

  • a05246eb-a131-34fe-a4b4-d06c06850a40-thumb.png
  • 大小: 34.8 KB
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章