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/

猜你喜欢

转载自alenzhai.iteye.com/blog/2058746
cde