记一个bug:Linux中Java Graphics drawString写中文乱码
近期用到了动态生成二维码的功能,并且在二维码底下加文字,win下开发没有出现问题,但是部署到Linux环境下出现中文乱码。经排查之后发现代码中Font类(new Font("微软雅黑", Font.PLAIN, 35))用到了"微软雅黑"中文字体,但Centos默认没有这种字体,所以出现乱码。安装好字体后,重新启动Tomcat之后出现了:java.lang.
近期用到了动态生成二维码的功能,并且在二维码底下加文字,win下开发没有出现问题,但是部署到Linux环境下出现中文乱码。经排查之后发现代码中Font类(new Font("微软雅黑", Font.PLAIN, 35))用到了"微软雅黑"中文字体,但Centos默认没有这种字体,所以出现乱码。安装好字体后,重新启动Tomcat之后出现了:
java.lang.UnsatisfiedLinkError: sun.font.FreetypeFontScaler.initIDs(Ljava/lang/Class;)V
报错,然后多方论证确认是jdk的版本问题,我系统用的1.8.0_111,升级到1.8.0_191以后问题得以解决。此处贴出Linux安装字体步骤。
1. 在 /usr/share/fonts 目录底下创建文件夹 chinese(文件夹名称可自取)
2. 复制需要添加的字体文件 "*.ttf"或"*.ttc" 到 /usr/share/fonts/chinese
3. 移动到/usr/share/fonts/chinese目录底下,使用以下命令创建索引(生成fonts.scale和fonts.dir)
/usr/share/fonts/chinese # mkfontdir
/usr/share/fonts/chinese # mkfontscale
备注:如果命令不能正常识别请用以下方法安装。
-
yum install mkfontscale
-
yum install fontconfig
4. 刷新字体:fc-cache
5. 查看字体:fc-list
注:第3步如果提示 mkfontscale/mkfontdir: command not found,需自行安装 # yum install mkfontscale/mkfontdir。如果fc-list没有看到添加的字体,有可能是此字体受版权保护无法添加进去,建议换成免费字体。步骤执行完之后重启Tomcat服务就生效了。
bug详情:
Caused by: java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.jfinal.aop.Invocation.invoke(Invocation.java:73)
... 37 more
Caused by: java.lang.UnsatisfiedLinkError: sun.font.FreetypeFontScaler.initIDs(Ljava/lang/Class;)V
at sun.font.FreetypeFontScaler.initIDs(Native Method)
at sun.font.FreetypeFontScaler.<clinit>(FreetypeFontScaler.java:50)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at sun.font.FontScaler.<clinit>(FontScaler.java:98)
at sun.font.TrueTypeFont.getScaler(TrueTypeFont.java:1298)
at sun.font.FileFontStrike.<init>(FileFontStrike.java:179)
at sun.font.FileFont.createStrike(FileFont.java:95)
at sun.font.Font2D.getStrike(Font2D.java:359)
at sun.font.Font2D.getStrike(Font2D.java:281)
at sun.java2d.SunGraphics2D.checkFontInfo(SunGraphics2D.java:774)
at sun.java2d.SunGraphics2D.getFontInfo(SunGraphics2D.java:830)
at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:50)
at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2928)
at cn.edu.group.ks.util.ImageUtil.addDetailOnPic(ImageUtil.java:61)
at cn.edu.group.ks.service.impl.JsQrCodeServiceImpl.getJsQrCodeImge(JsQrCodeServiceImpl.java:113)
at cn.edu.group.ks.service.impl.JsQrCodeServiceImpl.getJsQrCode(JsQrCodeServiceImpl.java:37)
at cn.edu.group.ks.controller.js.ClassroomController.getQrCode(ClassroomController.java:168)
at cn.edu.group.ks.controller.js.ClassroomController.batchQr(ClassroomController.java:183)
... 42 more
重要的两步:
1.添加字体库;
2.如果未解决升级下jdk版本。
参考文章:https://www.jianshu.com/p/354d5ab51215
jdk的卸载及升级参考:Linux中以rpm方式安装JDK_阿枫的博客-CSDN博客_rpm安装jdk
更多推荐
所有评论(0)