根本原因是oracle自带jre缺少cjk字体,需将simhei.ttf等中文字体重命名为lucidasans.ttf并放入jre/lib/fonts目录,刷新字体缓存、设置jvm参数;临时设lang=en_us.utf-8仅跳过中文渲染路径,不修复字体缺失问题。

Oracle安装界面显示方块,不是字符编码设错了,而是它自带的JRE压根没中文字体——runInstaller硬编码只加载jre/lib/fonts/LucidaSans.ttf,而这个文件在Oracle精简版JRE里只有西文字形,遇到中文就fallback成方块。
为什么export LANG=en_US.UTF-8有时“管用”
它不解决字体缺失,只是让Swing跳过中文字符串渲染路径,强制走英文资源。界面变英文了,方块没了,但代价明显:
-
dbca、netca等后续图形工具仍乱码,它们各自启动新JVM,同样缺字体 - 在
ssh -X或Xmanager等X11转发场景下常无效,因为字体由远端X Server提供,LANG对X Server无影响 - 若系统已设
LC_ALL=C,会覆盖LANG,导致设置静默失效 - 部分封装脚本(如
oracle_install.sh)会在runInstaller启动前重置环境变量
真正修复:替换LucidaSans.ttf并刷新字体链
必须把中文字体文件放进Oracle JRE的字体目录,并确保权限和命名完全匹配:
- 选一个可用中文字体,比如
simhei.ttf(Windows黑体)或zysong.ttf(中文宋体),重命名为LucidaSans.ttf - 找到Oracle解压包里的JRE路径,通常是
database/jre/1.8.0/jre/lib/fonts/(11g/12c)或linuxx64_19c_database_home/jdk/jre/lib/fonts/(19c) - 备份原
LucidaSans.ttf,再把重命名后的字体复制进去,权限设为644:chmod 644 LucidaSans.ttf - 如果是在远程X11环境(如RHEL/CentOS),还需在服务端装中文字体包:
yum install cjkuni-uming-fonts gnu-free-sans-fonts,然后运行sudo fc-cache -fv
Linux下X11转发仍乱码?检查DISPLAY与JVM参数
即使字体替换了,X Server端若未正确加载中文字体,Java仍可能走X11字体协议而非本地渲染:
- 确认
DISPLAY指向有效的X Server:echo $DISPLAY应返回类似localhost:10.0,且X Server已启用trusted forwarding(ssh -Y优于-X) - RHEL8/CentOS8默认用Wayland,需切回X11会话(登录时选“GNOME on Xorg”)
- 可加JVM参数强制使用本地字体渲染:
export JRE_OPTIONS="-Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true" - 验证是否生效:写个最小
TestFont.java,用同一JRE编译运行,Graphics2D.drawString("测试", ...)能正常显示才算到位
最容易被忽略的是:Windows上改注册表里的NLS_LANG、开“Beta版UTF-8支持”、或者在cmd里chcp 936,对setup.exe调用的javaw.exe完全无效——真正起作用的,只有JRE字体文件本身和启动它的那个shell环境变量。











