使用iText 7打印西班牙语文本到控制台及PDF时遇编码异常
这种带重音字符的乱码问题我之前踩过好几次坑,本质就是全链路编码不一致——从数据库读取到内存字符串,再到PDF输出/控制台打印,只要有一个环节编码不统一就会出问题。咱们从源头到输出一步步排查:
第一步:确认数据库连接的编码配置
不管你用的是MySQL还是其他数据库,JDBC URL里必须明确指定UTF-8编码,确保数据库返回的字节流是UTF-8格式。比如MySQL的URL要加上:jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8很多时候乱码的根源就是这里没配置,导致数据库返回的字节用系统默认编码转成了字符串。
第二步:检查ResultSet读取数据的方式
从ResultSet取数据时,别用getBytes()手动转字符串(除非你明确指定编码),优先用getString()——只要数据库连接编码正确,getString()会自动用正确的编码解析字节。如果必须用getBytes(),一定要指定UTF-8:// 错误示例:用系统默认编码转,大概率出问题 String wrongText = new String(rs.getBytes("your_column")); // 正确示例:指定UTF-8编码 String correctText = new String(rs.getBytes("your_column"), StandardCharsets.UTF_8);第三步:PDF生成时的字体必须支持Unicode
iText的默认字体(比如Helvetica)不支持很多特殊字符(带重音的ô就属于这类),这也是你看了论坛帖子还没解决的可能原因——只改了编码,但没换支持的字体。你需要用支持Unicode的字体,比如嵌入系统里的Arial Unicode MS,或者开源的Noto Sans:// 示例:使用带Unicode支持的字体生成PDF内容 BaseFont baseFont = BaseFont.createFont("Arial Unicode MS", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); Font unicodeFont = new Font(baseFont, 12); Paragraph paragraph = new Paragraph(yourTextVariable, unicodeFont); document.add(paragraph);要是系统里没有Arial Unicode MS,可以下载Noto Sans字体文件(比如NotoSans-Regular.ttf),然后用绝对路径加载:
BaseFont baseFont = BaseFont.createFont("/path/to/NotoSans-Regular.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);第四步:控制台打印的编码设置
控制台也乱码的话,要确认IDE/终端的编码是UTF-8:- IDEA:File → Settings → Editor → File Encodings,把
Console Encoding改成UTF-8 - Eclipse:Window → Preferences → General → Workspace,设置Text file encoding为UTF-8
- 终端:比如Windows cmd要执行
chcp 65001切换到UTF-8编码
- IDEA:File → Settings → Editor → File Encodings,把
总结一下:必须保证数据库连接编码→字符串读取→PDF字体→控制台编码全链路都是UTF-8,少一个环节都可能出乱码问题。
内容的提问来源于stack exchange,提问作者Am Novice

