ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

树莓派中文显示配置:中文字体、locale与换源避坑

树莓派中文显示配置:中文字体、locale与换源避坑

简介:这份面向树莓派初学者的docx文档,聚焦系统界面中文化这一常见需求,适合刚接触Linux、希望减少英文界面障碍并改善国内网络环境下软件更新体验的用户参考。压缩包内仅含1个docx文件,整体约732KB,篇幅集中,便于在电脑端快速查阅和对照练习。文档以步骤化方式组织内容,覆盖更换国内镜像源、安装文泉驿正黑字体、使用raspi-config调整区域与键盘设置、重启生效及效果核对等关键环节,并附有相应命令、配置片段和最终效果图,可帮助读者理解各步骤的作用与先后关系,排查源地址失效、中文字体缺失等常见问题。目前已有231人学习下载,可作为树莓派中文环境配置、课程实验或社团教学的入门参考。

1. 树莓派改中文显示:先把「满屏方块」的锅分清楚

插上 HDMI、通电、进桌面,菜单里一半是英文,另一半是方块——这不是屏幕坏了,是系统里根本没有中文字体,也没开中文 locale。很多人第一反应是「装个字体就完事」,结果apt install卡在下载上,因为默认源在海外,几十 KB 的包能转半天。更常见的翻车是照着几年前的老帖把jessie的源整段贴进新系统,apt update刷出一屏 404,连带原来的源也被覆盖没了。这一套流程(换源、装文泉驿正黑、raspi-config选 locale、重启验证)本身不复杂,但它对版本极其敏感,代号和菜单名一错,后面每一步都会歪。下面按我实际走通的顺序记录,适合刚拿到板子、系统装在 SD 卡上的开发者照着复现。

2. 换源与前置检查:raspi.list 里哪几个字段不能照抄

换源的目的是把软件包索引和安装流量拉到更近的镜像上,让apt-get update和后面的字体安装能在几十秒内完成,而不是等超时。但这件事有个前提:源地址里带着发行版代号,代号必须和当前系统一致,否则镜像站上没有对应的目录,服务器直接给你 404。老帖子里写死的jessie属于 Debian 8 那一代,现在手上的卡大概率不是这个版本,所以第一步不是编辑文件,是先把系统版本和现有源摸清楚。

2.1 先确认系统代号,再决定源怎么写

插好网线或连上 WiFi,打开终端,先把三件事查出来:发行版、代号、当前生效的源文件清单。

# 一次性看清发行版和代号,VERSION_CODENAME 就是源地址里要用的那个词 cat /etc/os-release # 列出 sources.list.d 下所有源文件,raspi.list 只是其中之一 ls -l /etc/apt/sources.list.d/ # 看当前 raspi.list 到底写了什么,编辑前一定要先看 cat /etc/apt/sources.list.d/raspi.list

/etc/os-release是 systemd 系发行版的标准元数据文件,VERSION_CODENAME=这一行就是我要的答案,比如jessie、stretch、buster、bullseye、bookworm。ls -l那一步的意义在于确认系统用的是「单文件」还是「分文件」布局——新版 Raspberry Pi OS 把主源放在/etc/apt/sources.list,把厂商源放在sources.list.d/raspi.list,两条链路是叠加生效的,改错文件等于白改。如果lsb_release -a提示 command not found,不用专门去装,os-release的信息已经够了。

常见做法是对照一下:原料里给的jessie只适用于 Debian 8 时代的镜像目录;stretch、buster各自换名字,路径结构不变;到了bullseye及以后的版本,raspbian/raspbian这条路径基本不再作为主源使用,官方已并到 Debian 的 armhf 仓库,这时强行沿用老写法只会得到空目录。所以后面代码块里的两条地址,请把jessie这个位置替换成你自己查出来的代号,其余字段原样保留。

2.2 备份、注释、写入:nano 的三个动作别做错

编辑之前先复制一份原文件,这是唯一一颗后悔药,出问题直接cp回去就能恢复。

# 备份原文件,带 .bak 后缀,出问题时一条 cp 就能还原 sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak # 用 nano 打开编辑 sudo nano /etc/apt/sources.list.d/raspi.list

进入 nano 后,把文件里原有的源地址在行首加#注释掉,注意是「注释」不是「删除」——留着它,日后排查时能一眼看出原始配置长什么样。然后在下方补两条国内镜像地址,原料给的写法如下,其中jessie按 2.1 查到的代号替换:

# 原地址保留注释,出问题便于对照回滚 # deb http://archive.raspbian.org/raspbian/ jessie main contrib non-free rpi # 第一条国内镜像,字段顺序:类型 地址 代号 组件 deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ jessie main contrib non-free rpi # 第二条作为备份镜像,第一条不可用时 apt 会尝试它 deb http://mirrors.neusoft.edu.cn/raspbian/raspbian/ jessie main contrib non-free rpi

每一行拆开看是四段:deb表示二进制包源(源码包是deb-src);中间是镜像站的目录地址,末尾的raspbian/raspbian/双层路径不是手滑,是镜像站的目录结构;第三段是发行版代号,这一项写错就是 404;最后main contrib non-free rpi是组件列表,main是官方自由软件,contrib和non-free放的是依赖非自由组件的包,rpi是树莓派专有组件,删掉rpi会导致部分硬件相关包找不到。

保存这一步是新手最容易栽的地方:nano 的Ctrl+X是「退出」,不是「保存」。按下去之后屏幕底部会问Save modified buffer?,此时按Y,再按回车确认文件名,才算真正落盘。如果直接连按几下回车跳过,文件根本没改,回头apt update用的还是老源,人会以为镜像站挂了。

2.3 apt-get update 之后,从输出里读三个信号

改完文件立刻刷新索引:

# 刷新软件包索引,只更新列表,不安装任何东西 sudo apt-get update

输出里每一行前缀有含义:Hit表示索引没变化、直接复用本地缓存;Get表示真的从镜像下载了新索引;Ign表示这一行被忽略,通常是组件名写错或该镜像没有这个目录;Err是失败,后面会跟 HTTP 状态码。我要看的是有没有Err和404。全部Hit或Get才算通;如果刷出一堆404 Not Found并带着jessie字样,那就是代号和系统不匹配,回到 2.1 重查。最后一行通常是Reading package lists... Done,出现这行说明索引构建完成,可以往下走。

2.4 sources.list 与 sources.list.d 是叠加关系

有个容易误判的现象:明明raspi.list改对了,apt update还是报某些地址连不上。原因往往在另一个文件——/etc/apt/sources.list里还留着老的海外主源,或者sources.list.d/下还有别的.list文件在生效。apt 会把sources.list和sources.list.d/*.list全部读进来合并成一张索引表,任何一条坏源都会在输出里冒出来,虽然不致命,但会拖慢整个 update。

排查方式是临时把可疑文件改名加.disabled后缀(apt 只认.list结尾),再跑一次 update 对比输出:

# 临时停用某个源文件,apt 只读取 .list 结尾的文件 sudo mv /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.disabled # 验证是哪个文件在报错,确认后再改回来 sudo apt-get update sudo mv /etc/apt/sources.list.d/raspi.list.disabled /etc/apt/sources.list.d/raspi.list

这个手法我在排查多源冲突时用得最多,比逐行注释快得多。确认全部源都健康之后,换源这一步就算收尾,可以进入字体安装了。

3. 安装中文字体:ttf-wqy-zenhei 这条命令装了什么

换源解决的是「下得动」,装字体解决的是「画得出」。Linux 桌面渲染文字靠 fontconfig 找字体,找不到对应字形的字符就画成方块——业内叫豆腐块。树莓派官方镜像出于体积考虑,默认只带少量西文字体,中日韩字形基本缺席,所以中文文件名、网页中文、终端里的中文都会变成方块。原料里选的是ttf-wqy-zenhei,文泉驿正黑,一个覆盖常用汉字、体积不大、在低配设备上渲染速度可以接受的开源黑体。

3.1 装之前先看清这个包的信息

# 查看包描述、版本、依赖和安装后占用空间,确认镜像里确实有它 apt-cache show ttf-wqy-zenhei

输出里重点看三行:Version是镜像提供的版本号,不同代号的系统版本号会不一样,这不影响使用;Installed-Size是解包后占用的 KB 数,一般几 MB 到十几 MB,SD 卡剩余空间只要不是个位数 MB 都没问题;Depends是依赖项,字体包通常只依赖fontconfig之类的渲染基础库,这些在桌面版里本来就有。如果这条命令返回E: No packages found,说明索引没刷新或者源里没有这个包,回第 2 章重跑apt-get update。

3.2 安装与第一轮验证

# -y 表示不交互确认,适合脚本化;平时手动装可以不加,看清确认信息 sudo apt-get install -y ttf-wqy-zenhei # 列出系统当前能识别的中文字体,正常情况下应该能看到 WenQuanYi Zen Hei fc-list :lang=zh

fc-list :lang=zh里的:lang=zh是 fontconfig 的过滤语法,意思是「列出所有声明支持中文的字体」。装成功的话输出会带一行形如/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc: WenQuanYi Zen Hei:style=Regular的记录。这个路径值得记一下,字体文件实际落在/usr/share/fonts/truetype/wqy/目录下,后面排查「装了但没生效」时要来这里确认文件是不是真的在。

如果这条命令没有任何输出,先别急着怀疑镜像,跑一次字体缓存重建:

# -f 强制重建,-v 输出详细过程,能看到扫描到哪些字体目录 sudo fc-cache -fv

fc-cache干的事是扫描字体目录并生成缓存索引,某些精简系统装完包不会自动触发。-f忽略时间戳强制重扫,-v打印每个被扫描的目录。输出里如果出现/usr/share/fonts/truetype/wqy,说明字体目录被认到了,再跑一次fc-list :lang=zh基本就出来了。

3.3 字体不够用时的兜底方案

文泉驿正黑覆盖的是常用汉字,遇到生僻字、部分繁体异体字或者 emoji 时仍可能缺字形。桌面环境下我一般再加一个思源黑体的包兜底:

# 思源黑体,字重更全、覆盖更广,体积比文泉驿大不少,空间紧张时二选一 sudo apt-get install -y fonts-noto-cjk # 装完确认两个字体族都在 fc-list :lang=zh | wc -l

fonts-noto-cjk是 Noto 系列的中日韩合集,字形完整度高,代价是包体积几十 MB 起步,SD 卡容量小或者跑 Lite 版纯命令行的机器上没必要装。wc -l是数行数,装之前可能只有个位数甚至 0,装完应该变成两位数。这一步不是必需项,属于「装了文泉驿之后某些界面还是有个别方块」时的补丁。

3.4 字体存在不等于界面会用它

有个认知差要提前纠正:装字体和系统语言是两件独立的事。字体决定「有字形可画」,locale 决定「系统该不该用中文渲染、用什么编码解析文本」。只装字体不改 locale,桌面菜单依然显示英文,只是原来那些方块变成了正常的中文——多见于文件名、网页标题这类内容文本。反过来只改 locale 不装字体,界面文字会切到中文,但一个都画不出来,满屏方块。

所以这两步的顺序不能省,先把字体铺好,再去raspi-config里动 locale。另外,装完字体后已经开着的应用不会自动重载字体列表,某些程序需要关掉重开才认新字体,这是正常现象,不用当成安装失败。

4. raspi-config 设置 locale:菜单名和勾选方式都以当前版本为准

raspi-config是树莓派官方的系统配置工具,一个基于终端的菜单程序,locale、时区、键盘布局都从这里进。它的坑集中在两点:菜单层级在版本迭代中改过名字,以及勾选界面用的是空格键而不是回车。这两点原料里也提到了——「空格选中」,这是关键操作提示,很多人卡在这一步,按回车直接跳回上级菜单,以为工具坏了。

4.1 菜单路径随版本变了,先认准当前层级

# 需要 root 权限,进入后是方向键导航、Tab 在按钮间切换 sudo raspi-config

进去之后,老版本里的入口叫Internationalisation Options,新版改成了Localisation Options,再下一级才是Change Locale、Change Timezone、Change Keyboard Layout、Change Wi-Fi Country。如果你按老教程找Internationalisation Options翻遍整页都没有,不是你按错了键,是菜单改名了,直接找Localisation Options即可。这一步的判断依据很简单:主菜单里带 I18n 或 Localisation 字样的那个条目就是。

进去后先选Change Locale。屏幕会列出几百个 locale,光标停在列表上,此时的操作是:方向键移动、空格打星号标记、Tab切到<Ok>再回车确认。只按回车不按空格,等于什么都没选,退出后会提示「没有变化」。

4.2 en_US.UTF-8 和 zh_CN.UTF-8 必须同时存在

这是整篇里最值得强调的一个取舍。列表里往下翻,找到en_US.UTF-8 UTF-8和zh_CN.UTF-8 UTF-8,两个都用空格标记上,然后确认。原因在于:zh_CN.UTF-8提供中文界面和中文排序规则,但一旦系统里只有它,很多命令行工具输出的报错信息、帮助文本也会被翻译成中文,在 SSH 终端里遇到编码不一致时反而更难搜;保留en_US.UTF-8作为默认,可以让底层工具保持英文输出,桌面层再单独切中文,兼容性最好。

配置工具退出后,用命令行确认生成结果:

# 生成 locale 数据,某些版本 raspi-config 已自动调用,手动跑一遍不会有副作用 sudo locale-gen # 查看当前生效的 locale 设置,重点看 LANG 和 LC_ALL locale

locale输出里的LANG=是全局默认语言,LC_ALL=是最高优先级覆盖项,如果LC_ALL有值,它会盖掉其他所有LC_*。常见问题是LC_ALL被设成了某个不存在的 locale,导致所有程序回落到C,界面又变英文。这时用sudo update-locale LANG=zh_CN.UTF-8显式写一次,或者手动清空/etc/default/locale里的LC_ALL行,再重新登录。

4.3 时区、键盘与 WiFi 国家码一起配掉

同一层菜单里剩下三项建议一次配完,避免反复重启。时区用命令更直接:

# 设置时区,时区标识符可以从 timedatectl list-timezones 里查 sudo timedatectl set-timezone Asia/Shanghai # 确认结果,输出里 Time zone 一行应显示设置值 timedatectl

timedatectl是 systemd 提供的统一时间管理入口,比dpkg-reconfigure tzdata的交互界面更快,写进脚本也方便。键盘布局在Change Keyboard Layout里选,国内常见的 104 键布局选Generic 104-key PC,键盘型号一栏一般选Generic PC Keyboard,后面的组合键映射保持默认。WiFi 国家码决定了允许使用的信道范围,选错会出现「能搜到热点但连不上」的玄学问题,在Change Wi-Fi Country里选对应项即可。

4.4 重启之前先做一次配置快照

sudo reboot之前,把这次改过的文件位置记下来,下次重装系统或者换卡能省一半时间:/etc/apt/sources.list.d/raspi.list(源)、/etc/default/locale(语言)、/etc/timezone(时区)。三条cat拼一条命令就能存档:

# 把关键配置打成一份快照,方便换卡后对照恢复 { cat /etc/apt/sources.list.d/raspi.list; \ cat /etc/default/locale; \ cat /etc/timezone; } > ~/sys-config-snapshot.txt

这个习惯救过我几次——换卡重装后不记得当时 locale 是怎么勾的,翻出快照一眼就对上了。快照存到用户目录下,注意别存到/tmp,重启就没了。

5. 避坑与排查:换源装字体最常翻的五次车

下面五条都是我在真机上遇到过、并且有明确现象和对应解法的。每条按「现象 → 原因 → 解决」记录,遇到问题时可以直接对号入座。

5.1 apt-get update 刷出一屏 404,全是 jessie 字样

现象:改完源执行更新,输出里连续出现Err ... 404 Not Found,URL 里带着jessie,最后提示Some index files failed to download。

原因:镜像站的目录结构跟发行版代号绑定,系统实际不是 jessie,却照抄了老帖的代号,镜像上根本没有对应目录。

解决:cat /etc/os-release看VERSION_CODENAME,把 raspi.list 里第三段代号换成查到的值,重新sudo apt-get update。如果新版系统上raspbian/raspbian路径本身就不可用,就保留原文件注释掉的内容,改回官方源结构,或者用备份文件cp /etc/apt/sources.list.d/raspi.list.bak还原后再研究。

5.2 nano 改完保存了,可文件内容一点没变

现象:编辑、按Ctrl+X、以为保存成功,再cat一遍发现还是老内容。

原因:Ctrl+X只是退出动作,nano 会在底部追问Save modified buffer?,需要按Y再回车确认文件名,直接回车等于放弃修改。

解决:重新打开文件,改完按Ctrl+X→Y→Enter三步走完,然后用cat回读一次确认。养成「改完必回读」的习惯,比事后怀疑镜像站靠谱得多。

5.3 按老教程找不到 Internationalisation Options

现象:sudo raspi-config进主菜单,翻遍所有条目都没有Internationalisation Options,以为自己进错了工具。

原因:新版本把这一项改名为Localisation Options,功能不变,只是措辞调整。

解决:认功能不认名字,找带「本地化/国际化」含义的那一项进去,子菜单里的Change Locale、Change Timezone是关键入口。不确定版本时,用raspi-config --version或者dpkg -l raspi-config看版本号,再对着该版本的菜单结构操作。

5.4 字体装了、locale 也选了,桌面还是方块

现象:fc-list :lang=zh能列出文泉驿正黑,locale里LANG=zh_CN.UTF-8,可桌面上依然方块。

原因:三种可能——字体缓存没重建;系统是 Lite 版根本没有图形界面,看到的「桌面」其实是远程终端;或者改完 locale 没重启,正在跑的桌面会话还持有旧的 locale 环境变量。

解决:先sudo fc-cache -fv重建缓存;再确认系统是不是桌面版(ls /usr/bin/startx或者看有没有图形会话进程);最后老老实实sudo reboot,会话级的环境变量只在新会话里生效。三条挨个排,基本能定位。

5.5 中文文件名在桌面正常,SSH 终端里全是乱码

现象:本地显示器上中文文件名显示正常,从另一台机器 SSH 连上去ls,中文变成问号或乱码。

原因:SSH 客户端和服务端的字符编码不一致,服务端 locale 是zh_CN.UTF-8,而客户端终端模拟器按 GBK 或者C解析字节流。

解决:优先统一成 UTF-8。客户端终端模拟器的编码设置为 UTF-8;服务端确认locale输出里LANG和LC_CTYPE都是*.UTF-8;如果临时要用,可以在会话里export LANG=en_US.UTF-8让输出先回到英文,便于读报错。别去改zh_CN.GBK,那是给自己挖坑。

6. 重启之后怎么验证中文是真的跑通了

sudo reboot之后别急着看桌面截图就下结论。判断一套中文环境是否真的生效,我一般分三层验证:字符层、环境层、应用层。三层都过,才算装完,缺一层都可能在某次操作里突然冒出方块。

第一层看字体,命令层面的证据最硬:

# 数一下系统认到的中文字体数量,0 就是没装上 fc-list :lang=zh | wc -l # 看具体字体族名,确认 WenQuanYi Zen Hei 在里面 fc-list :lang=zh | head -5

数量为 0 说明字体包没装成或者缓存没建,回到第 3 章。能列出WenQuanYi Zen Hei且数量大于等于 1,字符层就算过。

第二层看环境变量,这决定了系统「想不想」用中文:

# 只挑关键变量看,LANG 是默认语言,LC_ALL 是最高优先级覆盖 locale | grep -E 'LANG|LC_ALL|LC_CTYPE' # 确认系统识别到的编码是 UTF-8 而不是 ANSI_X3.4 或 GBK echo $LANG

期望结果是LANG=zh_CN.UTF-8且LC_ALL为空或同为 UTF-8。如果LANG是en_US.UTF-8,界面会保持英文但中文能正常显示——这其实是很多人的最优解,不算失败。真正要警惕的是LANG显示成C或POSIX,那说明 locale 根本没生成,回第 4 章重跑locale-gen。

第三层最简单也最有说服力,直接用中文文件名做一次端到端测试:

# 建一个纯中文文件名,若有乱码会在这一步暴露 touch ~/中文测试文件.txt # 列目录确认字节能被正确解析,不是问号也不是方块 ls ~ | grep 中文

如果ls能正常回显「中文测试文件.txt」,说明从文件系统到终端渲染这条链路是通的。接着打开桌面文件管理器看一眼中文文件名和菜单项,打开浏览器访问任意中文页面看字形是否完整,右键菜单是不是中文——这几处覆盖了 GTK 渲染、菜单翻译和网页字体回退三条路径,能一次暴露大部分残留问题。

验证层命令或动作通过标准不通过时回看
字符层fc-list :lang=zh | wc -l输出大于 0第 3 章安装与缓存重建
环境层locale | grep LANG值为*.UTF-8,非C第 4 章 locale 生成
应用层touch ~/中文测试文件.txt后ls文件名完整回显第 5.5 条编码排查
界面层打开文件管理器与右键菜单菜单为中文、无方块第 5.4 条会话未刷新

有个小技巧值得单独说:改完 locale 后如果不想立即重启,可以先注销再登录,图形会话会重新读取/etc/default/locale,效果和重启接近,省一次开机等待。但如果同时还换了源和字体,还是建议完整重启一次,避免缓存和索引处于中间状态,回头排查时分不清是哪一步没生效。

从那以后我每次动完 locale 和字体,都强制走一遍「fc-list 数一遍、locale 看一眼、中文文件名建一个」这三步,再截图存档。踩过的坑告诉我,中文显示这类问题很少是一次性配错的,多半是某一层看起来好了、另一层还没跟上,等真正用到的时候才爆出来。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表