最近用到HighChart作图,在图片导出时,出现了图片中中文乱码的问题,在网络上找了很多资料,但都没有解决,最后才发现了最容易被忽略的问题。具体见下。

由于之前有同事使用过HighChart,所以毫不犹豫了之前同事使用的方法:通过自己书写servlet,利用batik工具完成不同格式图片的导出,具体方法见下:

@RequestMapping(value = "/save_image", method = RequestMethod.POST)
public void saveImage(HttpServletRequest request,
HttpServletResponse response, String type, String svg,
String filename) throws IOException {
request.setCharacterEncoding("utf-8");
filename = filename == null ? "chart" : filename;
ServletOutputStream out = response.getOutputStream(); if (null != type && null != svg) {
svg = svg.replaceAll(":rect", "rect");
String ext = "";
Transcoder t = null;
if (type.equals("image/png")) {
ext = "png";
t = new PNGTranscoder();
} else if (type.equals("image/jpeg")) {
ext = "jpg";
t = new JPEGTranscoder();
} else if (type.equals("application/pdf")) {
ext = "pdf";
t = (Transcoder) new PDFTranscoder();
} else if (type.equals("image/svg+xml"))
ext = "svg"; response.addHeader("Content-Disposition", "attachment; filename="
+ filename + "." + ext);
response.addHeader("Content-Type", type); if (null != t) {
TranscoderInput input = new TranscoderInput(new StringReader(
svg));
TranscoderOutput output = new TranscoderOutput(out); try {
t.transcode(input, output);
} catch (TranscoderException e) {
out.print("Problem transcoding stream. See the web logs for more details.");
}
} else if (ext.equals("svg")) {
OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
writer.append(svg);
writer.close();
} else
out.print("Invalid type: " + type);
} else {
response.addHeader("Content-Type", "text/html");
out.println("Usage:\n\tParameter [svg]: The DOM Element to be converted."
+ "\n\tParameter [type]: The destination MIME type for the elment to be transcoded.");
}
out.flush();
out.close();
}

之后修改exporting.js文件,将其中的导出URL改为上述servlet中指定的URL。方法与网络上的大致相同。

但是问题来了,测试的同事告诉我部署在Linux服务器上的应用在导出图片时,中文都变成了小框框,一般这种乱码问题都会想到是编码问题,于是开始在网络上找解决方法。

首先根据http://ollevere.iteye.com/blog/1773563中提到的解决方法二,在代码中添加了

request.setCharacterEncoding("utf-8");

部署测试之后,发现不管用

于是,继续海搜,看到了http://jstree.iteye.com/blog/1586623,又在代码中加下

response.setCharacterEncoding("utf-8");

部署测试后,发现还是不管用

其实,我在工程的servlet配置中,已经对字体做了转码配置。如果没有进行配置,还是要像上面提到的方法控制servlet中的编码。

<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
<!-- 将Jackson2HttpMessageConverter的默认格式化输出设为true -->
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="prettyPrint" value="true" />
<property name="supportedMediaTypes">
<list>
<value>text/html;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>

这时我测试发现,部署在本地(Windows7系统)tomcat服务器上的应用并没有这个问题,导出的图片中中文显示得很正常,这时,有点懵了。

于是想到是不是Linux服务器上有什么地方没有配置正确?但在比较本地tomcat和服务器tomcat的配置之后,发现两者大同小异,甚至我把本地的配置拷贝到服务器,部署测试后,问题仍然存在。想到会不会是java版本不同,结果看了,Linux服务器上用的是Java1.7,而本地用的是Java1.6。但是看了下也没有找到问题所在。

这时,自己感觉很无力,也几乎耽误了一天时间了。

于是开始找同事咨询,同事看了之后就提到说是不是Linux服务器上是不是不支持设定的中文字体,突然感觉眼前一亮,可能找到问题所在了,于是前端同事配合修改highchart画图时设置的font-family,添加了linux中默认的字体Monospace,但是问题仍没有解决。

之后找做系统方面的同事咨询:是Linux系统中缺少中文字体包还是jdk中缺少中文字体包才导致这个问题,他给出的答案是应该是jdk中缺少中文字体包,于是,在jdk中安装了几个常用的中文字体包,再部署应用测试,问题解决了。虽然之前也想到可能是服务器上配置的问题,但没想到是JDK中缺少中文字体包,还是经验不足啊。

此次的查错过程甚是曲折,不过总算把问题解决了,特意整理出来,供大家参考。有不足之处,请大家见谅。

HighChart利用servlet导出中文PNG图片乱码问题解决的更多相关文章

  1. 利用Servlet导出Excel

    -----因为Excel可以打开HTML文件,因此可以利用页面的Form表单把页面中的table内容提交给Servlet,然后后台把提交上来的table内容转换成文件流的形式,并以下载的形式转给客户端 ...

  2. Servlet中response、request乱码问题解决

    Java Web(二) Servlet中response.request乱码问题解决   三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现 ...

  3. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  4. window.location.href url含中文服务器收到乱码问题解决

    中文乱码问题 window.location.href url含中文服务器收到乱码问题解决 (1).页面中先对中文进行编码. 如:window.location.href = url+"&a ...

  5. window nginx 中文路径, 文件名乱码问题解决

    window nginx 中文路径, 文件名乱码, error, not found 此问题是由于windows系统编码与nginx编码设置不一致导致的,因此我们要统一二者的编码 nginx编码设置 ...

  6. Java Web(二) Servlet中response、request乱码问题解决

    三月不减肥,五月徒伤悲,这就是我现在的状态,哈哈~ 健身.博客坚持. --WH 一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, M ...

  7. web开发(二) Servlet中response、request乱码问题解决

    在网上看见一篇不错的文章,写的详细. 以下内容引用那篇博文.转载于<http://www.cnblogs.com/whgk/p/6412475.html>,在此仅供学习参考之用. 一.re ...

  8. mantis 中文统计报表乱码问题解决办法

    mantis 中文报表乱码问题 1.安装mantisTB 1.2.17:a.安装插件:管理-->插件管理-->安装MantisGraph(Mantis图表 1.0) 插件b.修改配置文件: ...

  9. 锐浪报表 导出 PDF ANSI码 乱码 问题解决

    锐浪 报表 导出PDF时如果 ANSI 码 打勾了会乱码,能将这个选项默认不打勾吗 //在报表导出事件脚本里写脚本,可实现导出控制Sender.AsE2PDFOption.AnsiTextMode=0 ...

随机推荐

  1. js的节流和防抖

    1,节流 节流就是对连续的函数触发,在设定的间隔时间段内,只让其执行一次. 先来看看js高级程序设计3里面节流的代码 function throttle (method, context, wait) ...

  2. SQL数据库Replace的用法

    关于数据库Replace的用法:Replace("字符串","要被替代的字符串","替代后的字符串")尝试过写法效果如下->修改前 效 ...

  3. sql 简单语法

    1.数据库操作 create database student_info -- 创建数据库 drop database student_info -- 删除数据库 2.表操作 -- 创建表 creat ...

  4. 在线词云制作tagxedo

    最近在用python制作词云的时候发现了一个更加方便快捷很好玩的词云制作网站 http://www.tagxedo.com/app.html 所以今天就来大致介绍下是怎么使用的 1.先来介绍下tagx ...

  5. 手写JDBC - 数据库、驱动信息存储在配置文件

    1. 将数据库.驱动信息存储在配置文件 configure.properties url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=GMT& ...

  6. lua路径问题

    方法1:lua进行require绝对路径时,会从package.path中进行遍历 print(package.path)会得到类似下面的结果: --> "lualibs/p4ulib ...

  7. LeetCode 100.相同的树(C++)

    给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1 ...

  8. C 六度空间理论的实现

    “六度空间”理论又称作“六度分隔(Six Degrees of Separation)”理论.这个理论可以通俗地阐述为:“你和任何一个陌生人之间所间隔的人不会超过六个,也就是说,最多通过五个人你就能够 ...

  9. 【ExtJS】关于标准模块化封装组件

    在此之前,自己封装自定义控件用的是这样的方式: Ext.define('My.XXX',{ extend: 'Ext.YYY', xtype: 'ZZZ', . . . items:[ ... ] } ...

  10. ES6数组新加 Buff

    欢迎关注本人公众号<迈向大前端>,里面有15本前端相关的电子书,送给在前端路上迷茫的同学们! 本章篇幅很长,分开来发,这一小篇主要讲ES6数组的Array.of()和Array.from( ...