本页主题: BIRT2.1.0中文化问题的解决方法 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

rongzhengmao

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 5
威望: 1 点
财富: 108 元
在线时间:0(小时)
注册时间:2006-07-18
最后登录:2006-09-25

BIRT2.1.0中文化问题的解决方法

BIRT中文化问题解决

上次我在论坛上提出了有关BIRT中文化的问题,现在终于找到解决办法,与大家共享,修改代码后的jar包请见附件,直接替换原来的即可。

一、环境
1、Eclipse 3.2
2、BIRT 2.1.0
3、JDK1.5.0_7,BIRT的编译环境是JDK1.4,所以在Eclipse中需要将JDK设为1.4兼容
4、Tomcat 5.5.12

二、界面中文化问题

1、问题描述:通过使用http://host:port/birt-web-hom/frameset?parameters这种方式浏览报表时,出现的界面是英文的。

2、解决方法
(1)birt的CVS中有所有的源代码,签出到本地(具体方法可参考:http://www.eclipse.org/birt/phoenix/build/buildInstructions.php#checkout

(2)签出到本地后,找到org.eclipse.birt.report.viewer.nl/src/org/eclipse/birt/report/resource,该文件夹下有几个语言文件,如:BirtResources_de_DE.msg、BirtResources_es_ES.msg、BirtResources_fr_FR.msg、BirtResources_ja_JP.msg、BirtResources_ko_KR.msg、BirtResources_zh_CN.msg,其中我们中文用户最关心的是最后一个文件,将这个文件copy到其他目录,然后改名为BirtResources.properties

(3)birt-runtime-2_1_0.zip中有birt.war,将其发布到Tomcat中

(4)找到%Tomcat_Home%/webapp/birt/WEB-INF/lib/viewservlets.jar,在这个包下找到org/eclipse/birt/report/resource目录,然后将刚才改过名的BirtResources.properties文件压缩进来,这个文件会替换原来这个目录下的同名文件

(5)现在需要修改源代码,需要修改源代码的类是viewservlets.jar/org/eclipse/birt/report/resource/BirtResources.class,你可以在你从CVS中签出的源代码中的org.eclipse.birt.report.viewer/birt/WEB-INF/classes/org/eclipse/birt/report/resource文件夹中找到BirtResources.java文件,在这个java文件中找到public static String getString( String key )这个方法,原来的代码是这样的:

public static String getString( String key )
   {
       try
       {
           return ( bundle != null ) ? bundle.getString( key ) : key;
       }
       catch ( MissingResourceException e )
       {
           return key;
       }
   }
   
   修改为:
   public static String getString( String key ) throws UnsupportedEncodingException
   {
       try
       {
           String temp = ( bundle != null ) ? bundle.getString( key ) : key;
           String str = new String(temp.getBytes("ISO-8859-1"),"GBK" );
           return str;
       }
       catch ( MissingResourceException e )
       {
           return key;
       }
   }
   将这个文件编译好的class文件压缩到viewservlets.jar的同等目录下,替换原来的文件
   
(6)启动Tomcat,通过frameset方式访问你已经编辑好的报表,你可以看到界面(包括对话框)中的文件应该已经是中文了


三、get或post方法传递中文参数的解决方法

1、问题描述:如果你在设计报表时增加了参数,在通过get或post方法向这个参数传递中文值时,birt无法解析,因为birt默认的是在UTF-8和ISO-8859-1两个字符集中进行转换,对于中文用户,应该让birt在GBK和ISO-8859-1这两个字符集中进行转换

2、解决方法

(1)普通的JSP和Servlet乱码问题的解决方法对birt不适用,但是你应该首先解决这个普通的乱码问题,这里不作说明

(2)在viewservlet.jar下找到org/eclipse/birt/report/utility下找到ParameterAccessor.class文件,现在要修改这个文件的源代码

(3)你可以在你从CVS中签出的源代码中的org.eclipse.birt.report.viewer/birt/WEB-INF/classes/org/eclipse/birt/report/utility文件夹中找到ParameterAccessor.java文件,在这个java文件中找到这行:
public static final String UTF_8_ENCODE = "UTF-8"; //$NON-NLS-1$
将这行改为
public static final String UTF_8_ENCODE = "GBK"; //$NON-NLS-1$
然后将这个编译好的class文件压缩到viewservlets.jar的同等目录下,替换原来的文件

(4)在上一步中,如果你用eclipse找开ParameterAccesor.java文件,在使用assert的语句行,eclipse会报错,你可以直接将使用assert的语句注释掉。

(5)重启Tomcat,你现在可以通过get或post方法传递中文值了

四、其他

1、我这里说明的是如何解决中文化的思路,最终至于如何修改这两个类的代码就看各人了,我上面的两种修改方法虽然直接了当地找到了原因,但不是最好的修改方法。

2、一开始我用BIRT的时候,将参数__locale理解为如何将birt本身适应国际化需要,实际上这个参数是为了解决报表内容的国际化,但我想到,既然上面提到的两个中文化问题实际上仍然属于国际化问题范围,为什么__locale参数不能用于解决这两个问题呢,所以我下一步将使用__locale参数解决上面的两个中文化问题,这种方法应该是比较好的。

3、BIRT是一个不错的报表工具,但通过开源化走商业化的路线,让我不免担心Actuate公司究竟会将BIRT做得多强大。从另外一个角度将,对于小型应用系统,BIRT足够了。

4、我的联系方式
   MSN:rongzhengmao@gmail.com
   E-Mail:rongzhengmao@gmail.com
   对于技术人员而言,一个技术问题解决不了,是件很苦恼的事情。
   如果上面两个问题也困绕你很久,你看完本文这后也觉得不能解决,欢迎与我联系。
附件: viewservlets.jar (371 K) 下载次数:300
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Neil Mao
顶端 时间: 2006年07月19日 16:28 | [楼 主]
vii779

状态: 离线
级别: CEC贵宾
精华: 2
发帖: 640
威望: 3 点
财富: 717 元
在线时间:0(小时)
注册时间:2006-07-05
最后登录:2007-02-07

希望birt开发小组能解决这个问题,而不是靠我们打补丁。
既然大部分开发人员都是中国人,为什么对自己的语言还处理不好。
顶端 时间: 2006年07月19日 20:36 | 1 楼
xl801026

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 7
威望: 1 点
财富: 109 元
在线时间:0(小时)
注册时间:2006-07-26
最后登录:2007-09-14

谢谢,这文章对我非常有用,我是刚开始接触,向你们学习
顶端 时间: 2006年07月26日 10:42 | 2 楼
leiyi0219

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 17
威望: 1 点
财富: 120 元
在线时间:0(小时)
注册时间:2006-07-11
最后登录:2007-06-19

附件下载不了!
装中文包不行吗
顶端 时间: 2006年08月01日 15:43 | 3 楼
gflei

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 56
威望: 1 点
财富: 176 元
在线时间:0(小时)
注册时间:2006-09-18
最后登录:2007-11-28

Quote:
引用第3楼leiyi02192006年08月01日 15:43发表的“”:
附件下载不了!
装中文包不行吗



Quote:
二、界面中文化问题

1、问题描述:通过使用http://host:port/birt-web-hom/frameset?parameters这种方式浏览报表时,出现的界面是英文的。


对与这个问题,birt本身就支持,不建议使用楼主的方式

建议方式:
直接把语言包
Copy code
org.eclipse.birt.report.viewer.nl1_2.1.0.jar
放入
Copy code
WEB-INF\lib
下即可。

顶端 时间: 2006年09月22日 14:09 | 4 楼
wwwlll2001

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 28
威望: 1 点
财富: 134 元
在线时间:0(小时)
注册时间:2006-08-30
最后登录:2007-01-06

解决第2个问题的时候的方法没试过,我的做法是把toUTFString()这个方法里的那段to utf-8的那句话注掉了,我看这里是硬编码的,没有可以改参数的,噢,我改的是2.0的,可能2.0在这里是硬编码的了
顶端 时间: 2006年09月23日 22:08 | 5 楼
bao-ya

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 13
威望: 1 点
财富: 114 元
在线时间:0(小时)
注册时间:2006-06-20
最后登录:2007-03-06

org.eclipse.birt.report.viewer.nl1_2.1.0.jar
这个语言包在哪里得到
顶端 时间: 2006年10月09日 17:16 | 6 楼
jy00057800

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 15
威望: 1 点
财富: 121 元
在线时间:0(小时)
注册时间:2006-10-09
最后登录:2007-02-08

post或get 的时候 编码在给url前编码一下就好了
function sear()
{
   var m = document.all["mldh"].value;        
   alert(m);
   m = encodeURI(m);        
   document.frame1.location.href='<%=request.getContextPath()%>/run?__report=test.rptdesign&mldh='+m+'&__overwrite=true'
}
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
只有弱者才会说不公平
顶端 时间: 2006年10月11日 09:08 | 7 楼
libing

状态: 离线
级别: CEC程序员
精华: 0
发帖: 37
威望: 11 点
财富: 4 元
在线时间:0(小时)
注册时间:2006-04-28
最后登录:2008-10-14

 不知道 对2.1.1 版本可用不,研究好几天了 还没有解决导出乱码问题
顶端 时间: 2006年10月12日 11:46 | 8 楼
wyz2008

状态: 离线
级别: CEC高级程序员
精华: 0
发帖: 159
威望: 1 点
财富: 278 元
在线时间:0(小时)
注册时间:2006-10-17
最后登录:2007-12-27

我也是.我用的是2.1.1版本.
不过导出的.csv文件也是有乱码
求高手指教
顶端 时间: 2006年11月07日 16:23 | 9 楼
k_ch_b

状态: 离线
级别: CEC程序员
精华: 0
发帖: 7
威望: 1 点
财富: 9 元
在线时间:0(小时)
注册时间:2007-03-22
最后登录:2007-05-28

[回jy00057800]:
您的方法对run方式果然好用,可是对frameset方式却不好使!
对frameset方式如何处理呢?
顶端 时间: 2007年04月18日 14:16 | 10 楼
ydrbz

状态: 离线
级别: CEC程序员
精华: 0
发帖: 3
威望: 1 点
财富: 4 元
在线时间:0(小时)
注册时间:2007-05-16
最后登录:2008-07-22

您好!在论坛上看到您关于birt的回复:

[回jy00057800]:
您的方法对run方式果然好用,可是对frameset方式却不好使!
对frameset方式如何处理呢?

请问,frameset乱码解决了么?是怎么解决的?
期待您的回复:我的msnLydrbz@hotmail.com
顶端 时间: 2007年05月17日 09:52 | 11 楼
mycatboys

状态: 离线
级别: CEC程序员
精华: 0
发帖: 11
威望: 1 点
财富: 11 元
在线时间:0(小时)
注册时间:2007-05-18
最后登录:2007-11-25

我也是.我用的是2.1.1版本.





-----------------------------------------------------------------------------------------------------
经过数个不眠之夜,申请主机注册,下载bolg网站,接着上传到域名注册,终于有自己独立域名和空间的blog网站,终于有了自己的一片独立空间
顶端 时间: 2007年05月18日 01:36 | 12 楼
class_syh

状态: 离线
级别: CEC程序员
精华: 0
发帖: 4
威望: 1 点
财富: 4 元
在线时间:0(小时)
注册时间:2008-06-30
最后登录:2008-11-07

受益了!
顶端 时间: 2008年07月12日 14:59 | 13 楼
zhangfang529

状态: 离线
级别: CEC程序员
精华: 0
发帖: 3
威望: 1 点
财富: 3 元
在线时间:0(小时)
注册时间:2008-07-21
最后登录:2008-08-11

请问,您还有2.1.0版本的birt吗?能发我一个吗?zhangfang529@163.com,多谢了
顶端 时间: 2008年07月24日 15:35 | 14 楼
中国Eclipse社区 » 报表应用


辽ICP备05021625号