主题 : BIRT2.1.0中文化问题的解决方法
级别: CEC高级程序员
UID: 27638
精华: 0
发帖: 5
威望: 1 点
积分: 108 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2006-07-18
最后登录: 2006-09-25
0  发表于: 2006年07月19日 16:28

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) 下载次数:320
Neil Mao
级别: CEC贵宾
UID: 25652
精华: 2
发帖: 640
威望: 3 点
积分: 717 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2006-07-05
最后登录: 2009-06-04
1  发表于: 2006年07月19日 20:36

希望birt开发小组能解决这个问题,而不是靠我们打补丁。
既然大部分开发人员都是中国人,为什么对自己的语言还处理不好。
级别: CEC高级程序员
UID: 28755
精华: 0
发帖: 11
威望: 1 点
积分: 114 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2006-07-26
最后登录: 2008-12-10
2  发表于: 2006年07月26日 10:42

谢谢,这文章对我非常有用,我是刚开始接触,向你们学习
级别: CEC高级程序员
UID: 26502
精华: 0
发帖: 17
威望: 1 点
积分: 120 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2006-07-11
最后登录: 2007-06-19
3  发表于: 2006年08月01日 15:43

附件下载不了!
装中文包不行吗
级别: CEC高级程序员
UID: 34846
精华: 0
发帖: 56
威望: 1 点
积分: 176 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2006-09-18
最后登录: 2007-11-28
4  发表于: 2006年09月22日 14:09

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



引用
二、界面中文化问题

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


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

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

级别: CEC高级程序员
UID: 32257
精华: 0
发帖: 28
威望: 1 点
积分: 134 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2006-08-30
最后登录: 2009-06-05
5  发表于: 2006年09月23日 22:08

解决第2个问题的时候的方法没试过,我的做法是把toUTFString()这个方法里的那段to utf-8的那句话注掉了,我看这里是硬编码的,没有可以改参数的,噢,我改的是2.0的,可能2.0在这里是硬编码的了
级别: CEC高级程序员
UID: 24066
精华: 0
发帖: 13
威望: 1 点
积分: 114 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2006-06-20
最后登录: 2007-03-06
6  发表于: 2006年10月09日 17:16

org.eclipse.birt.report.viewer.nl1_2.1.0.jar
这个语言包在哪里得到
级别: CEC高级程序员
UID: 37232
精华: 0
发帖: 15
威望: 1 点
积分: 121 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2006-10-09
最后登录: 2007-02-08
7  发表于: 2006年10月11日 09: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'
}
只有弱者才会说不公平
级别: CEC程序员
UID: 18667
精华: 0
发帖: 37
威望: 11 点
积分: 4 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2006-04-28
最后登录: 2009-03-27
8  发表于: 2006年10月12日 11:46

 不知道 对2.1.1 版本可用不,研究好几天了 还没有解决导出乱码问题
级别: CEC高级程序员
UID: 38333
精华: 0
发帖: 159
威望: 1 点
积分: 278 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2006-10-17
最后登录: 2007-12-27
9  发表于: 2006年11月07日 16:23

我也是.我用的是2.1.1版本.
不过导出的.csv文件也是有乱码
求高手指教
级别: CEC程序员
UID: 58222
精华: 0
发帖: 7
威望: 1 点
积分: 9 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2007-03-22
最后登录: 2007-05-28
10  发表于: 2007年04月18日 14:16

[回jy00057800]:
您的方法对run方式果然好用,可是对frameset方式却不好使!
对frameset方式如何处理呢?
级别: CEC程序员
UID: 63459
精华: 0
发帖: 3
威望: 1 点
积分: 4 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2007-05-16
最后登录: 2008-07-22
11  发表于: 2007年05月17日 09:52

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

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

请问,frameset乱码解决了么?是怎么解决的?
期待您的回复:我的msnLydrbz@hotmail.com
级别: CEC程序员
UID: 63694
精华: 0
发帖: 14
威望: 1 点
积分: 14 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2007-05-18
最后登录: 2009-06-29
12  发表于: 2007年05月18日 01:36

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





-----------------------------------------------------------------------------------------------------
经过数个不眠之夜,申请主机注册,下载bolg网站,接着上传到域名注册,终于有自己独立域名和空间的blog网站,终于有了自己的一片独立空间
级别: CEC程序员
UID: 106313
精华: 0
发帖: 4
威望: 1 点
积分: 4 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2008-06-30
最后登录: 2008-11-07
13  发表于: 2008年07月12日 14:59

受益了!
级别: CEC程序员
UID: 108479
精华: 0
发帖: 3
威望: 1 点
积分: 3 分
贡献: 0 点
在线时间: 0(时)
注册时间: 2008-07-21
最后登录: 2008-08-11
14  发表于: 2008年07月24日 15:35

请问,您还有2.1.0版本的birt吗?能发我一个吗?zhangfang529@163.com,多谢了
辽ICP备05021625号