根本原因是oracle runinstaller硬编码只加载jre/lib/fonts/lucidasans.ttf,而自带jre缺中文字形,导致中文fallback为方块;nls_lang、lang等环境变量对swing界面无效,必须将simhei.ttf等重命名为lucidasans.ttf并覆盖替换,同时确保x server端安装中文字体并刷新fc-cache。

Oracle 11g/19c runInstaller 显示方块,根本不是编码问题
它压根不读 NLS_LANG、LC_ALL 或系统 locale 设置——这些变量只影响 SQL*Plus、exp 等命令行工具的字符编解码,和 Swing 界面渲染完全无关。真正卡住的是字体加载链:runInstaller 启动时硬编码只加载 jre/lib/fonts/LucidaSans.ttf,而 Oracle 自带的精简 JRE 里这个文件只有西文字形,遇到中文就 fallback 成方块。
为什么 export LANG=en_US.UTF-8 有时“管用”
这不是修复,是绕过:
- Swing 检测到
LANG不含中文 locale,直接跳过所有中文资源加载,全程走英文字符串路径 - 界面变成英文,不再尝试绘制中文,自然不触发缺字 fallback
- 但
dbca、netca、asmca等后续图形工具仍会乱码,因为它们各自启动新 JVM,同样缺字体 - 在
ssh -X或 Xmanager 场景下常无效:X Server 端没装中文字体,或DISPLAY指向了不支持中文的远端 X server
必须替换 LucidaSans.ttf 文件才能真解决
这是唯一能覆盖所有图形工具(包括后续 dbca)的方法:
- 进入安装包解压目录,定位到
stage/jre/1.8.0/lib/fonts/(Linux)或install/jre/(Windows) - 备份原
LucidaSans.ttf,把simhei.ttf或NotoSansCJKsc-Regular.otf重命名为LucidaSans.ttf并覆盖 - 执行
chmod 644 jre/lib/fonts/LucidaSans.ttf(Linux),确保 JVM 可读 - Windows 用户还需禁用「Beta 版 UTF-8 支持」:设置 → 时间和语言 → 区域 → 管理语言 → 更改系统区域设置 → 取消勾选该选项
RHEL 8 / 银河麒麟等现代发行版要额外注意 DISPLAY 和字体缓存
即使替换了 JRE 字体,X11 转发下仍可能走服务端字体链:
- 确认当前会话是 X11:运行
echo $XDG_SESSION_TYPE,输出必须是x11,不是wayland;登录时手动选 “GNOME on Xorg” - 服务端(即你 ssh 连入的那台机器)必须装中文字体包:
yum install cjkuni-uming-fonts gnu-free-sans-fonts - 刷新系统字体缓存:
sudo fc-cache -fv - 运行前加 JVM 参数:
export JRE_OPTIONS="-Dawt.useSystemAAFontSettings=lcd -Dswing.aatext=true" - 验证
DISPLAY权限:xhost +si:localuser:oracle(以 oracle 用户执行)
LANG,但图形界面实际由远端 X Server 渲染——如果服务端没装中文字体、没刷缓存、或者跑在 Wayland 下,换再多次 LANG 都只是白忙。











