excel报表工具FineReport之编码转换

2025-04-23 21:24:47

报表已集成到Web页面中,通过在页面传递参数至报表中时,会发现有时某些参数值,传递到报表中是显示为问号(???)或乱码等等一系列不能正常显示的情况。

工具/原料

FineReport

1.问题原因

1、这是由于浏览器和报表服务器的编码不同,字符多次进行编码转换时出现错误导致字符的显示出现乱码,尤其是中日韩文和特殊字符更容易出现乱码问题。详细的编码原理,可参考编码文档

2.解决方案

1、在给报表服务器发送请求之前,对URL或者只对URL里面的参数名字和参数值,进行cjkEncode的编码,该方式兼容了各种不同的字符集,如ISO8859-1、 UTF-8、 GBK、 ENU_JP,尤其对中日韩文的处理采取了统一的方案。

3.javascript中FineReport字符转换原理

1、在给报表服务器发送请求之前,对URL或者只对URL里面的参数名字和参数值,进行cjkEncode的编码。源码如下:

2、functioncjkEncode(text){if(text==null){return"";}varnewText="";for(vari=0;i<text.length;i++){varcode=text.charCodeAt(i);if(code>=128||code==91||code==93){//91is"[",93is"]".newText+="["+code.toString(16)+"]";}else{newText+=text.charAt(i);}}returnnewText;

3、经过编码的URL或者Form表单,报表服务器智能的将这些字符正确的转换过来。cjkEncode方法在FineReport的JS库中已经预先提供了,用户只要加载了FR的JS库,就可以使用FR.cjkEncode对中日韩文字符进行encode,如下示例:

4.示例

1、4.1 对URL进行cjkEncode<html><head><metahttp-equiv="Content-Type"content="text/html;charset=GBK"><scripttype="text/javascript"src="ReportServer?op=emb&resource=finereport.js"></script><ScriptLanguage="JavaScript">functionfrOpen(){window.location=FR.cjkEncode("http://localhost:8075/WebReport/ReportServer?reportlet=doc/Primary/Parameter/Parameter.cpt&地区=华东");}</Script></head><body><inputtype="button"value="字符转换1"onclick="frOpen()"></body></html>

2、4.2对Form表单进行cjkEncode如果是以Form表单把参数提交到报表里面,也同样需要在提交前调用cjkEncode进行粕盘镱嘧编码转换,如下例子<html><head><metahttp-equiv="Content-Type"content="text/html;charset=GBK"/><scripttype="text/javascript"src="/WebReport/ReportServer?op=emb&resource=finereport.js"></script><script>functionautoSubmit(){varRegion1=document.getElementById('Region');//获取到参数Region所在文本框Region1.value=FR.cjkEncode(Region.value);//对值参数值进行编码转化Region1.name=FR.cjkEncode("地区");//对参数控件名编码转换,如果参数名字为英文,则不需要此操作document.FRform.submit();}</script><body><formname=FRformmethod=postaction="/WebReport/ReportServer?reportlet=doc/Primary/Parameter/Parameter.cpt"><inputtype="text"id="Region"name="地区"value="华东"><inputtype="button"name="show"value="查看"onclick="autoSubmit()"/></body></html>

3、4.3特殊腿发滏呸符号处理如果在需要进行cjkEncode的URI的参数中包含特殊字符,比如%,#,$,=,&,/,?,+,@等字符时,需要在cjkEncode之后,再次调用枣娣空郅javascript的encodeURIComponent对这些特殊字符进行编码。如参数值是”%华%“这样的字符,就需要写成encodeURIComponent(FR.cjkEncode("%华%")),一定要先进行cjkEncode,然后再进行encodeURIComponent,完整代码如下:<html><head><metahttp-equiv="Content-Type"content="text/html;charset=GBK"><scripttype="text/javascript"src="ReportServer?op=emb&resource=finereport.js"></script><ScriptLanguage="JavaScript">functionfrOpen(){window.location=FR.cjkEncode("http://localhost:8075/WebReport/ReportServer?reportlet=doc/Primary/Parameter/Parameter.cpt&地区=")+encodeURIComponent(FR.cjkEncode("%华%"));}</Script></head><body><inputtype="button"value="字符转换1"onclick="frOpen()"></body></html>

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢