中文环境配置和中文输入法

适用读者:已完成前四篇配置、需要在 Arch Linux 上使用中文界面和输入法的读者。


前言:中文支持的两个层面

在 Linux 上”用中文”包含两件事:

  1. 中文显示:系统界面、终端、应用程序能正确显示中文字符(需要正确的 locale 和字体)
  2. 中文输入:能通过拼音等方式输入汉字(需要输入法框架)

两者都需要配置,缺一不可。


一、配置系统中文环境(locale)

1.1 什么是 locale?

locale 是操作系统的本地化设置,决定系统使用的语言、字符编码、日期格式、货币符号等。zh_CN.UTF-8 就是”中国大陆简体中文、UTF-8 编码”的 locale。

1.2 生成中文 locale

编辑 /etc/locale.gen,取消注释中文和英文的 UTF-8 行:

1
sudo nano /etc/locale.gen

找到并去掉这两行的 #

1
2
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8

然后生成:

1
sudo locale-gen

为什么要同时保留英文 locale?

某些程序在中文 locale 下会产生乱码(尤其是终端里的错误信息、man 页面),保留 en_US.UTF-8 作为备选可以避免这类问题。

1.3 设置默认语言

编辑 /etc/locale.conf

1
sudo nano /etc/locale.conf

桌面环境用户(GNOME / KDE / niri / Hyprland),设置为中文:

1
LANG=zh_CN.UTF-8

纯终端用户(WSL 或无桌面),建议保持英文,否则终端里的中文提示符和错误信息可能显示异常:

1
LANG=en_US.UTF-8

修改 /etc/locale.conf 后需要重新登录才能生效,或者执行:

1
export LANG=zh_CN.UTF-8

(仅对当前 shell 临时生效)

1.4 安装中文字体

设置了中文 locale 但没有中文字体,屏幕上的汉字会显示为方块。安装常用字体:

1
2
3
4
5
6
7
8
# 思源黑体(Adobe/Google 联合发布,高质量开源字体)
sudo pacman -S adobe-source-han-sans-cn-fonts

# 思源宋体(衬线体)
sudo pacman -S adobe-source-han-serif-cn-fonts

# Noto 字体(Google 出品,覆盖所有 Unicode 字符,防止"豆腐块")
sudo pacman -S noto-fonts noto-fonts-cjk noto-fonts-emoji

安装后刷新字体缓存:

1
fc-cache -fv

二、GNOME 下配置中文输入法(ibus-pinyin)

GNOME 内置了对 ibus 输入法框架的深度集成——GNOME 在登录时会自动启动 ibus 守护进程,无需额外配置启动。

2.1 什么是 ibus?

ibus(Intelligent Input Bus)是 Linux 下的输入法框架,负责在应用程序和具体输入法引擎之间传递按键事件。GNOME 选择 ibus 作为官方支持的输入法框架。

2.2 安装 ibus-pinyin

1
sudo pacman -S ibus ibus-pinyin
  • ibus:输入法框架本体
  • ibus-pinyin:拼音输入法引擎

2.3 配置 ibus

打开 GNOME 的”设置”→”键盘”→”输入源”,点击 + 号,选择”汉语(中国)”→”中文(Intelligent Pinyin)”添加。

或者通过命令行配置:

1
2
# 添加中文拼音输入源
gsettings set org.gnome.desktop.input-sources sources "[('xkb', 'us'), ('ibus', 'pinyin')]"

2.4 切换输入法

GNOME 默认使用 Super + Space 切换输入法。也可以在设置里改成 Ctrl + Space 或其他快捷键。

2.5 为什么 GNOME 用 ibus 而不是 fcitx5?

GNOME 通过 XDG Autostart 和 D-Bus 与 ibus 深度绑定,ibus 在 GNOME 下的体验更原生,无需额外配置。而 fcitx5 虽然功能更丰富,但在 GNOME 下需要额外处理与 ibus 的冲突(GNOME 登录时会同时启动两个输入法框架,造成混乱)。


三、niri 和 Hyprland 下配置中文输入法(fcitx5)

3.1 为什么 niri/Hyprland 用 fcitx5?

ibus 与 GNOME 耦合较深,在 niri、Hyprland 等独立窗口管理器下问题较多:输入法候选框位置错误、GTK 应用无法输入等。fcitx5 对 Wayland 合成器的支持更好,是平铺式窗口管理器用户的首选。

fcitx5 支持的输入方案也更丰富:除了拼音,还有五笔、仓颉、Rime(支持各种方言输入)等。

3.2 安装 fcitx5

1
2
3
4
5
6
7
8
9
10
11
# fcitx5 本体
sudo pacman -S fcitx5

# Rime 输入法引擎(包含拼音、五笔等多种方案)
sudo pacman -S fcitx5-rime

# fcitx5 图形配置工具
sudo pacman -S fcitx5-configtool

# GTK 和 Qt 输入法模块(让 GTK/Qt 应用能使用 fcitx5)
sudo pacman -S fcitx5-gtk fcitx5-qt

为什么要安装 fcitx5-gtkfcitx5-qt

在 Wayland 下,输入法有两种通信方式:

  1. Wayland text-input 协议(原生,效果最好)
  2. 输入法模块(GTK/Qt 各自的模块,兼容性更广)

安装 fcitx5-gtkfcitx5-qt 确保更多应用能正常调用输入法。

3.3 处理与 ibus 的冲突

fcitx5 安装后,会在 /etc/xdg/autostart/ 下放置一个自启文件 fcitx5.desktop。如果你的系统同时安装了 GNOME(或者之前用过 GNOME),登录桌面时可能同时启动 ibus 和 fcitx5 两个输入法框架,造成冲突。

处理方法:删除 fcitx5 的 XDG autostart 文件

1
sudo rm /etc/xdg/autostart/fcitx5.desktop

删掉之后,fcitx5 不再通过 XDG 自动启动,改为由合成器(niri/Hyprland)的配置文件显式启动。这样 GNOME 用 ibus,niri/Hyprland 用 fcitx5,互不干扰。

⚠️ 注意:如果你只用 niri/Hyprland,不用 GNOME,也建议这样操作,因为手动在合成器配置里启动 fcitx5 比 XDG autostart 更可控,可以精确控制启动时机。

3.4 配置环境变量

输入法框架需要通过环境变量告知各个工具包(GTK、Qt)应该使用哪个输入法:

niri 配置~/.config/niri/config.kdl):

1
2
3
4
5
6
7
8
environment {
GTK_IM_MODULE "fcitx"
QT_IM_MODULE "fcitx"
XMODIFIERS "@im=fcitx"
SDL_IM_MODULE "fcitx"
}

spawn-at-startup "fcitx5" "-d"

解析:

  • GTK_IM_MODULE "fcitx":告诉所有 GTK 应用(如 Firefox、Nautilus)使用 fcitx 输入法模块
  • QT_IM_MODULE "fcitx":告诉所有 Qt 应用(如 JetBrains IDE、VLC)使用 fcitx 输入法模块
  • XMODIFIERS "@im=fcitx":XIM 协议的输入法设置,用于老旧的 X11 应用(通过 XWayland 运行时)
  • SDL_IM_MODULE "fcitx":告诉 SDL2 应用(如某些游戏)使用 fcitx
  • spawn-at-startup "fcitx5" "-d":niri 启动时自动以后台模式(-d)运行 fcitx5

Hyprland 配置(新版 Lua 格式,~/.config/hypr/hyprland.lua):

1
2
3
4
5
6
7
8
9
10
-- 设置输入法环境变量
hl.env("GTK_IM_MODULE", "fcitx")
hl.env("QT_IM_MODULE", "fcitx")
hl.env("XMODIFIERS", "@im=fcitx")
hl.env("SDL_IM_MODULE", "fcitx")

-- 开机自启 fcitx5
hl.on("hyprland.start", function()
hl.exec_cmd("fcitx5 -d")
end)

Hyprland 配置(旧版 hyprlang 格式,~/.config/hypr/hyprland.conf):

1
2
3
4
5
6
7
8
# 输入法环境变量
env = GTK_IM_MODULE,fcitx
env = QT_IM_MODULE,fcitx
env = XMODIFIERS,@im=fcitx
env = SDL_IM_MODULE,fcitx

# 开机自启 fcitx5(后台静默模式)
exec-once = fcitx5 -d

3.5 配置 fcitx5-rime 拼音输入

首次启动 fcitx5 后,打开配置工具:

1
fcitx5-configtool

在图形界面里:

  1. 点击左下角 + 号添加输入法
  2. 取消勾选”只显示当前语言”
  3. 搜索 “rime” 或 “中文”,添加 Rime
  4. 点击 OK 保存

Rime 默认包含”朙月拼音”(繁体)和”仓颉五代”。要使用简体拼音,有两种方式:

方式 A:切换 Rime 内置方案

fcitx5-rime 安装后,默认会包含简体拼音。在输入法激活状态下,按 F4Ctrl+~ 可以打开方案选择菜单,选择”朙月拼音·简化字”。

方式 B:安装 rime-pinyin-zhwiki 词库(可选,扩充词汇量)

1
yay -S rime-pinyin-zhwiki

安装后在 fcitx5-configtool 里点击”重新部署 Rime”即可。

3.6 切换输入法

fcitx5 默认用 Ctrl + Space 切换中英文,用 Ctrl + Shift 切换不同输入法。可以在 fcitx5-configtool 的”全局选项”里修改。

3.7 验证输入法是否工作

打开 kitty 终端,切换到中文输入法,输入拼音,应该能看到候选词列表浮现。

如果没有出现候选框,执行诊断:

1
fcitx5-diagnose

这个命令会详细检查 fcitx5 的运行状态和环境变量配置,并给出修复建议。


四、中文字体渲染优化(可选)

4.1 配置字体优先级

在某些情况下,系统可能会选择日文版本的汉字字体,导致字形看起来”怪怪的”(日文汉字和中文简体字形有细微差异)。通过字体配置文件指定优先使用中文字体:

1
2
mkdir -p ~/.config/fontconfig
nano ~/.config/fontconfig/fonts.conf

写入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<!-- 优先使用中文字体渲染中文 -->
<match>
<test name="lang" compare="contains">
<string>zh</string>
</test>
<edit name="family" mode="prepend">
<string>Noto Sans CJK SC</string>
</edit>
</match>

<!-- 优先使用中文字体渲染日文 Unicode 区的汉字 -->
<alias>
<family>serif</family>
<prefer>
<family>Noto Serif CJK SC</family>
</prefer>
</alias>
<alias>
<family>sans-serif</family>
<prefer>
<family>Noto Sans CJK SC</family>
</prefer>
</alias>
<alias>
<family>monospace</family>
<prefer>
<family>Noto Sans Mono CJK SC</family>
</prefer>
</alias>
</fontconfig>

刷新字体缓存:

1
fc-cache -fv

五、常见问题排查

问题:终端里中文显示为乱码

原因:终端的字体不包含中文字符,或者编码设置有问题。

解决

1
2
3
4
5
6
7
8
# 确认当前编码是 UTF-8
echo $LANG

# 在 kitty 的配置里设置中文字体回退
echo 'font_family JetBrains Mono
font_size 13.0
# 中文回退字体
symbol_map U+4E00-U+9FFF,U+3400-U+4DBF Noto Sans CJK SC' >> ~/.config/kitty/kitty.conf

问题:fcitx5 启动了但无法输入中文

原因:环境变量没有被程序读取到(程序在 fcitx5 设置环境变量之前启动)。

解决

  1. 确认 niri/Hyprland 配置文件里的 GTK_IM_MODULE 等变量已正确设置
  2. 关闭并重新打开应用
  3. 运行 fcitx5-diagnose 查看详细信息

问题:GNOME 下同时运行了 ibus 和 fcitx5

原因:忘记删除 /etc/xdg/autostart/fcitx5.desktop

解决

1
sudo rm /etc/xdg/autostart/fcitx5.desktop

然后注销重新登录。

问题:JetBrains IDE 无法使用 fcitx5 输入中文

原因:JetBrains IDE 默认运行在 XWayland 下,需要 XIM 支持。

解决:在 IDE 的 JVM 选项里添加:

1
-Drecreate.x11.input.method=true

在 IDE 里通过 Help → Edit Custom VM Options 添加。


小结

至此,五篇博客的全部内容已经完成:

内容
第一篇 通过 archinstall 安装 Arch Linux + 多种桌面环境
第二篇 通过 WSL 在 Windows 上安装 Arch Linux
第三篇 安装 git、yay、sdkman、nvm、uv、Go、Docker、LazyVim
第四篇 通过 DMS 配置 niri 和 Hyprland
第五篇 中文 locale、字体、ibus(GNOME)、fcitx5(niri/Hyprland)

通过这五篇的配置,你拥有了一个:

  • 完整的中文支持(界面 + 输入)
  • 现代化的开发环境(Java/Node/Python/Go/Docker)
  • 高效的编辑器(Neovim + LazyVim)
  • 漂亮可用的桌面(DMS + niri 或 Hyprland)

的 Arch Linux 系统。