Windows Server部署Tomcat运行Jasper Reports生成报表乱码如何解决
Jasper Reports 报表导出乱码排查解决指南
1. 优先修正错误转码逻辑
你当前添加的转码代码存在本质错误,会直接导致乱码:
Files.write(Paths.get(informeModificacionesUnificado), Charset.forName("windows-1252").encode( StandardCharsets.UTF_8.decode(ByteBuffer.wrap(Files.readAllBytes(Paths.get(informeModificacionesUnificado))))) .array());
这段代码会把已经生成的UTF-8编码的报表文件,强制转码为windows-1252编码后覆盖写入。windows-1252是单字节西欧编码,不支持中文、西里尔文等非西欧字符,只要报表包含这类字符就必然出现乱码。直接删除这段冗余的转码代码即可。
2. 逐层校验编码配置
2.1 Tomcat 全局编码配置
- 检查
conf/server.xml中的Connector节点,添加编码配置:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
- 检查
conf/catalina.bat,添加JVM编码启动参数:
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
2.2 Jasper Reports 专项配置
- 确认
.jrxml模板文件头的编码属性为UTF-8:
<?xml version="1.0" encoding="UTF-8"?>
- 导出时显式指定编码,以PDF导出为例:
// 统一输出编码 response.setCharacterEncoding("UTF-8"); // PDF导出需额外配置字体编码,避免非西欧字符缺失/乱码 JRProperties.setProperty("net.sf.jasperreports.default.pdf.encoding", "Identity-H");
- 检查Windows Server的字体库:如果导出的文件出现方块型乱码,大概率是系统缺少报表使用的字体,可将对应字体文件放入JDK的
jre/lib/fonts目录,或在Jasper配置中指定自定义字体路径。
2.3 Java 批处理进程配置
- 运行批处理前先执行
chcp 65001,将cmd控制台的默认编码切换为UTF-8 - 批处理启动Java进程时,添加
-Dfile.encoding=UTF-8参数,保证进程默认编码为UTF-8
3. 常见场景补充说明
如果导出的是CSV格式,用Windows自带Excel打开出现乱码属于已知现象:Excel默认使用GBK编码解析CSV文件,可在导入时手动指定UTF-8编码,或导出时在文件头部添加UTF-8 BOM标记解决。
4. 快速定位技巧
- 导出文件后用VS Code、Notepad++等工具查看文件实际编码,确认是编码不匹配还是字体缺失导致的乱码
- PDF乱码优先排查字体配置,Excel/CSV乱码优先排查写入编码参数
内容的提问来源于stack exchange,提问作者okjfokjrf
相关产品推荐
相关产品推荐

