ubuntu中文支持必须三步齐备:生成zh_cn.utf-8 locale(sudo locale-gen)、配置系统环境变量(/etc/default/locale设lang=zh_cn.utf-8)、确保登录会话继承且不被用户脚本覆盖,缺一即导致乱码。

Ubuntu系统默认字符集不是靠“改一个配置就生效”的,而是由 locale 生成 + 环境变量加载 + 登录会话继承三者共同决定的。直接改 /etc/environment 或 /etc/default/locale 不生效,几乎一定是漏了 locale-gen 这步——这是最常被跳过的致命环节。
为什么 locale -a | grep zh_CN.UTF-8 查不到?
因为 Ubuntu 默认只预装了少量 locale(如 en_US.UTF-8),zh_CN.UTF-8 这类中文 locale 虽在支持列表里(/usr/share/i18n/SUPPORTED),但没执行 locale-gen 就不会真正编译进系统,也就不会出现在 locale -a 输出中。
- 先确认是否已启用:运行
locale -a | grep -i "zh_cn.*utf-8",无输出即未生成 - 补全支持项(可选):往
/var/lib/locales/supported.d/local里加一行zh_CN.UTF-8 UTF-8,再运行sudo locale-gen - 更稳妥的做法是直接用交互式配置:
sudo dpkg-reconfigure locales,空格选中zh_CN.UTF-8,回车确认,默认 locale 设为它
/etc/default/locale 和 /etc/environment 该用哪个?
两者都管环境变量,但加载时机和作用范围不同:/etc/default/locale 是 systemd 服务启动时读取的,影响大部分系统服务;/etc/environment 是 PAM 登录时加载的,对终端、GUI 应用更直接。优先写 /etc/default/locale,它更符合 Ubuntu 的设计习惯。
PostgreSQL 18.4 官方 Ubuntu 安装包现已发布,这是目前最新的稳定版本。推荐通过官方 APT 仓库安装:先执行 sudo apt update 更新索引,再运行 sudo apt install postgresql-18 即可完成部署。新版本引入了异步 I/O 子系统,在顺序扫描与 VACUUM 场景下性能提升显著,同时支持 UUID v7 原生生成函数与虚拟生成列。
- 编辑
/etc/default/locale,写入:LANG="zh_CN.UTF-8"<br>LANGUAGE="zh_CN:zh:en_US:en"
- 不要设
LC_ALL在这里——它会强制覆盖所有LC_*,反而让时间/货币等格式不按预期本地化 - 如果必须全局强控(比如跑 CI 容器),才在
/etc/environment加LC_ALL=zh_CN.UTF-8,但要清楚副作用
改完为什么 locale 命令还是显示 POSIX?
因为当前 shell 会话的环境变量没刷新,且用户级配置(如 ~/.profile)可能覆盖了系统设置。这不是配置失败,只是没生效到当前终端。
- 新开一个终端或重新 SSH 登录,
locale才会反映新值 - 如果仍不对,检查
~/.profile、~/.bashrc是否有硬编码的LANG=en_US.UTF-8或export LC_ALL=C——这类用户级设置优先级高于系统级 - 临时验证:运行
LANG=zh_CN.UTF-8 locale,若输出正常,说明系统 locale 已就位,问题纯属环境变量未继承
真正容易被忽略的是:locale 文件本身必须存在(locale-gen 生成),环境变量必须被登录进程加载(不能只改配置不重启会话),且不能被用户脚本覆盖。三个条件缺一不可,少一个就会回到 LC_CTYPE="POSIX" 的原始状态。










