fastreport的中文乱码问题,确实让人头疼,我使用的是delphi6+fastrepport4.7,在4.7版本中,主要表现在以下几种情况。
  1. 预览不乱码,保存乱码。
  2. 简体不乱码,繁体乱码。
  3. 简体系统不乱码,繁体系统乱码。
  4. 繁体字,写死在模板里面不乱码,但是在数据流中,显示在Memo中就乱码了。
     
  或者还有其他种情况,反正各种情况都可能有, 百度下fastreport乱码,都是说改源码,但是到对应位置一找,也没有找到相对的代码。问题就是这样的问题,而且fastreport的技术支持完全不行,本地化的机构还得重新交钱才能获取到技术支持,直接无语了,看了得自己解决了,但是怎么解决呢。仔细思考,大致有这么两种:
  1. 根本解决,从fastreport源码里面把这个问题根本解决。由于这个问题异常复杂,而且由于对fastreport工程不了解,从源码解决费时费力,没有这个精力,这个方法基本无望。
  2. 曲线救国。这个虽然看起来很牛逼的样子,但是需要对fastreport的机制相当了解,而且需要对fastreport处理字符的机制出现乱码问题的根源了解,再考虑躲避方法。看起来很简单的样子,其实也是异常繁琐复杂,但是相对第一种来说,这个还是相对来说比较省时省力。
 
   既然方法已经确定,首先的就是需要对fastreport的运行机制有个大致的了解了。大致的三层架构我就不想说了。这个大家都知道。乱码问题主要出现在渲染层面上。所以我们需要对这个机制进行了解。这时候麻烦来了,网上压根就没有这类资料。怎么办呢,难道去看代码,浩大的fastreport工程不是一两个月能够熟悉的,如果从这里入手,那么还不如从根本上解决这个问题呢,没有资料,又不想看源码,怎么办呢,只能发挥自己充分的想象力啦。
 
我说下我的思路。如果我们手工画一张报表,需要怎么做呢,每一个Memo都是我们自己手工一个一个画上去的吧,如果我们需要把某个memo的字体改掉,只要改这个memo就好了,那么按照软件设计的常规思路,memo里面应该有能够设置字体的属性,字体中应该是带有编码的。每次渲染的时候,MasterData是怎么工作的呢,我觉得应该是这样的,跟我们手动做报表一样,也是将一个一个memo创建出来然后放到了对应的位置,只不过是MasterData对这些控件进行了抽象。
 
  思路倒是有了,不过都是想象,毕竟没有跟fastreport的开发人员沟通过,不知道他们是不是原来就是这么设计的,我只是从常规的思路猜测了下,现在就先验证下思路是否正确。
 
  的确在Memo属性下找到了字体设置。有编码也有字体类型。
  按照正常思路,一般设置字体就能够解决乱码问题。因为有时候是由于字体只支持单字节导致中文乱码,把字体改为新宋体,的确解决了简体的乱码,保存成PDF都不乱码了。又发现繁体乱码,还有编码可以设置。直接设置成CHINESEBIG5_CHARSET的编码。繁体也正常了。到这里,乱码问题的一二三项都解决了。
 
  第四项问题稍微有点头疼了。我们明明设定好了memo的字体和编码,理论上只要不是碰上BIG5编码的时候的简体字,或者默认编码下的繁体字,应该不会是乱码的。经过一番思考,分析如下:
  1. 既然设定好编码不会乱码了,证明设定编码的方式是有效的。
  2. MasterData进行数据展示的时候,Memo控件也是一个个生成的,那么设定好编码的话,理论上也不会发生乱码。
 
  由以上分析得出,猜测是动态生成的时候编码没有设定好,或者是编码乱掉了。那么,尝试解决思路就是如何在动态生成的时候重新设定编码。然后看到控件meno里面有几个事件。看事件名字也可以知道大概的执行顺序。不过,我们也可以用showmessage这个赖皮招来测试事件的执行顺序,这个是个技巧啦。经测试发现,beforeprint->afterdata->afterprint。但是是在afterdata的时候能够接收到数据。
 
   现在可以在afterdata的时候指定控件的编码啦。但是有一个问题,发现指定的编码CHINESEBIG5_CHARSET这个是个宏定义。但是在代码里面不支持这个宏定义,那么就需要找出这个宏定义是代表什么值了。那么,还是用个笨方法找吧。showmessage。 先把meno的编码设置成CHINESEBIG5_CHARSET,然后把这个编码显示出来就知道了。

在AfterData里面。弹个窗。

 
frxMemoView := TFrxMemoView(Sender);
showmessage(inttostr(frxMemoView.Font.Charset));

  

  通过这个段测试代码得知CHINESEBIG5_CHARSET是编码是136;
那么反过来,我们就可以定义如下。
 
procedure DealTraditionalCharset(Sender: TfrxComponent);
var startStr,memoValue:string;
frxMemoView:TFrxMemoView;
begin
frxMemoView := TFrxMemoView(Sender);
memoValue := frxMemoView.Value;
if trim(memoValue) = '' then //有些是空值,很奇怪的。过滤掉。
Exit;
frxMemoView.Memo.Text := memoValue;
frxMemoView.Font.Charset := 136; // CHINESEBIG5_CHARSET
end;

  

  以上代码就是动态设置memo为繁体编码。如果数据流中,简体和繁体同时存在,目前所发现的编码中,由于我所使用的4.7版本尚未支持UFT8编码。所以这个是肯定会有乱码的。不过,如果繁体和简体不是同时存在,就是说繁体和简体不会存在同一段数据流,只是间隔数据流的话,如果在数据流里面加一个字体的标记,那么就可以动态控制memo的编码使之不乱码了。
 
  fastreport资料是在是太少了,而且网上估计也有不少人为这个编码问题头疼吧。在这个啥资料都没有的情况下,我觉得突破思路不外乎我这种了,从底层,内部结构开始构思,很多这种没有资料的东西,就假设如果是你自己开发的fastreport,你会怎么设计呢,也不外乎计算机的原理罢了。理同其理,法同其法,万物归一。

fastreport中文乱码问题的更多相关文章

  1. java中文乱码解决之道(一)-----认识字符集

    沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.c ...

  2. MAC下 mysql不能插入中文和中文乱码的问题总结

    MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...

  3. java中文乱码解决之道(九)-----总结

    乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到 ...

  4. 解决springmvc+mybatis+mysql中文乱码问题【转】

    这篇文章主要介绍了解决java中springmvc+mybatis+mysql中文乱码问题的相关资料,需要的朋友可以参考下 近日使用ajax请求springmvc后台查询mysql数据库,页面显示中文 ...

  5. freemarker页面中文乱码

    一.前言 简单的记录freemarker遇到的错误问题:ftl页面中文乱码 由于freemarker整合在ssm框架中,所以笔者直接贴配置代码 <beans xmlns="http:/ ...

  6. tomcat项目中文乱码问题解决方法

    在部署tomcat项目时经常会遇到中文乱码问题,解决的方法可参考以下步骤. 1.更改Tomcat安装目录下的conf\server.xml,指定浏览器的编码格式为"utf-8"格式 ...

  7. IE下get传中文乱码的问题 -- 解决方案 (js)

    W3school 函数 JavaScript 全局对象 定义和用法 encodeURI() 函数可把字符串作为 URI 进行编码. 语法 encodeURI(URIstring) 参数 描述 URIs ...

  8. JSP和Servlet的中文乱码处理

    JSP和Servlet的中文乱码处理 前几天学习了JSP和Servlet中有关中文乱码的一些问题,写成了博客,今天进行更新一下.应该是可以解决日常的乱码问题了.现在作以下总结希望对需要的人有所帮助.我 ...

  9. Git bash下中文乱码问题

    Git bash下中文乱码--解决方案 解决办法1: 在git bash下,右键 出现下图,选择options: 选择"Text" 将Character set设置为 UTF-8 ...

随机推荐

  1. 软工实践-Alpha 冲刺 (10/10)

    队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 完成所有界面的链接,整理与测试 展示GitHub当日代码/ ...

  2. Alpha冲刺总结报告

    一.项目预期计划 允许粗糙的美工设计.由于是毫无经验的人生第一次,必定在开发过程中会遇到许多的问题,因而我们必定会花费不少时间在学习和debug上. 实现除了他山之石和规则系统以外的所有内容. 在日历 ...

  3. linux 转移mysql文件操作流程

    1.现将mysql停服 2.将文件拷贝到指定目录cp ./sales_trade_2.ibd /db/data/mysql/data_warehouse/sales_trade_2.ibd 3.检查新 ...

  4. JAVA字节流(读写文件)

    InputStream此抽象类是表示字节输入流的所有类的超类.需要定义 InputStream 的子类的应用程序必须始终提供返回下一个输入字节的方法. int available()返回此输入流方法的 ...

  5. Halcon 学习笔记3 仿射变换

    像素的减少 开运算(较少) 腐蚀(去除更多) 对灰度图像的开运算或腐蚀 相当于将灰度图像变暗 像素增加 闭运算(较少) 膨胀(较多) 对灰度图像的闭运算或膨胀 相当于将灰度图像变亮 仿射变换 另外一种 ...

  6. error CS0234: 命名空间“System.Drawing”中不存在类型或命名空间名称“Image”(是否缺少程序集引用?)

  7. p2 形状

    形状是物理引擎进行碰撞模拟计算的依据,是刚体最基本的属性. P2中使用Shape类来表示形状,通过刚体的addShape()方法,将形状添加到刚体中之后, 就可以随着刚体的移动.旋转不断更新,并进行碰 ...

  8. 双主双写、只备份某些表且要在建表ID自增

    先展示下最终实现的配置 主1的配置(重要的,其他略) log-bin = mysql-bin #必须要有binlog auto_increment_offset = 1 #自增ID的初始值 auto_ ...

  9. Vue 取出记录数后,页面显示刚开始显示部分,点击更多显示全部

    实例的实现,是使用computed计算属性,还有对数组使用.slice函数,不改变原数据对象. <div id="app"> <ul> <li v-f ...

  10. dom变成jquery对象 先获取dom对象 然后通过$()转换成jquery对象

    dom变成jquery对象   先获取dom对象 然后通过$()转换成jquery对象