我有一个应用使用了batik来生成png图片,在本地环境测试时图片生成正常,中文能正常显示。但是这个应用部署到阿里云的centos环境,图片生成出来就是乱码。图片生成的部分代码如下
PNGTranscoder t = new PNGTranscoder();
t.addTranscodingHint(ImageTranscoder.KEY_MEDIA, "screen");
TranscoderInput input = new TranscoderInput(
new ByteArrayInputStream(formattedSvg.getBytes("UTF-8")));
TranscoderOutput output = new TranscoderOutput(bos);
try {
t.transcode(input, output);
return (ByteArrayOutputStream) output.getOutputStream();
} catch (Exception e) {
_logger.error("transcode error:", e);
return null;
}
我搜索了一些类似问题:
issues.apache.org/jira/browse/BATIK-1053
个人猜测是png的生成代码跟系统的字符集有关。我想问一下,是不是阿里云的系统字符集没有中文字体导致这个问题的?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据你的描述,问题可能确实与系统字符集或者字体库有关。阿里云的ECS(CentOS环境)默认安装的字体可能不包含所有中文字符,导致在生成PNG图片时无法正确渲染中文。
为了解决这个问题,你可以尝试以下步骤:
安装中文字体:首先确保你的服务器上安装了支持中文的字体。对于CentOS,可以使用以下命令安装常见的中文字体包:
sudo yum install -y wqy-microhei-fonts
这里以wqy-microhei
为例,它是一个广泛支持中文的字体。安装完成后,字体通常会被放置在/usr/share/fonts/wqy-microhei
目录下。
更新Java的字体配置:如果你的应用是基于Java运行的,需要确保Java能够找到并使用新安装的字体。这通常涉及到更新Java的字体配置文件,但Batik在转换时应该能自动检测系统字体。
指定字体路径或名称:在生成图片的代码中,如果Batik允许指定使用的字体,你可以尝试显式指定一个已知支持中文的字体名。不过,根据我所知,Batik在处理SVG到PNG的转换时,默认应该是依赖系统可用的字体。
检查代码中的编码设置:确认你的代码中所有涉及字符串和文件读写的部分都正确设置了UTF-8编码,你已经这么做了,看起来这部分没有问题。
测试:在完成上述步骤后,重新部署应用并测试图片生成功能,看是否解决了乱码问题。
如果以上方法仍然不能解决问题,可能需要更深入地查看Batik是否有特定的配置选项来指定字体路径,或者考虑是否有其他环境因素影响了字体的加载和使用。