ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

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

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

简介:面向树莓派初学者与 DIY 爱好者的中文显示设置文档,针对 Linux 系统默认英文界面带来的理解与操作障碍,提供一套可跟随执行的汉化配置思路。文档以换源、字体安装、区域与语言设置、重启验证为主线,记录终端命令、配置项选择及重启后的界面效果,便于读者理解各环节之间的依赖关系,并在遇到更新缓慢或中文不显示时对照排查。内容预览显示其以分步条目组织,先调整软件源以提升更新速度,再补齐中文字体,最后借助系统配置工具完成语言、时区与键盘布局设定,并在末尾附上效果查看。资源包共 1 个 docx 文件,大小约 732KB,篇幅集中、结构清晰,适合离线查阅与逐步实践。已有 231 人学习,说明该主题对入门用户具有实际参考价值。对于希望减少英文界面障碍、快速搭建中文使用环境的树莓派学习者,这份文档可作为轻量而完整的基础材料。

1. 树莓派改中文显示:三关没过完,装多少字体都是方块

树莓派刷完系统第一次接显示器,桌面菜单是英文的,打开浏览器访问中文页面却满屏方块——这两个现象看着像同一件事,其实是两条独立的链路。树莓派改中文显示要过三关:仓库源得能连通,否则字体包根本下不下来;字体包得提供中文字形,否则有编码没形状,方块照旧;locale 得把语言环境指到zh_CN.UTF-8,否则系统压根不认为自己该说中文。绝大多数人卡在第三关,装完文泉驿正黑发现界面纹丝不动,就是 locale 没动过。这套流程适合刚拿到板子、想一次配好的新手,也适合已经换过源、却被 404 和方块字反复折腾的人——下面按这三关的顺序拆,每一步都给能直接抄的命令和出错时的判断依据。

2. 换源这一步:树莓派 OS 的代号、路径与 apt update 的三种报错

换源是整个流程里最容易把人带沟里的一步,因为它看起来只是复制两行地址。实际上源文件里写死的发行版代号、仓库路径、组件列表,三者必须和板子上跑的系统严丝合缝,错一个字符就是apt update一路 404。原始教程里那两行jessie的写法,放在当年的 Raspbian 上是对的,但jessie是 Debian 8 的代号,主镜像站早就把它挪进归档区了,今天照着抄,大概率连不上。所以第一步不是打开编辑器,而是先认清手里这块板子到底跑的是哪一代。

2.1 先认清代号,再决定往文件里写什么

Debian 系的代号是有顺序的:jessie(8)、stretch(9)、buster(10)、bullseye(11)、bookworm(12),越往后越新。树莓派 OS 一直跟着 Debian 走,不同年份烧的卡,代号可能差好几代。代号写错不会立刻报错,而是等你执行apt update时才集中爆发,所以先花十秒确认。

# 一次性打印发行版全名、代号、架构,三条信息都影响源地址怎么写 . /etc/os-release printf '系统: %s\n代号: %s\n架构: %s\n' "$PRETTY_NAME" "$VERSION_CODENAME" "$(dpkg --print-architecture)"

逻辑说明:. /etc/os-release是把系统的元信息文件当脚本 source 进来,VERSION_CODENAME就是bookworm这类小写代号,PRETTY_NAME是给人看的完整描述。参数说明:dpkg --print-architecture输出armhf或arm64,它决定你能不能混用别人给的源——32 位系统配 64 位仓库的包,装上去也是白装。把代号记下来,后面所有地方都必须用它,不要凭印象写。

还有一点要留意:较新的树莓派 OS 把仓库拆成了两处。Debian 官方包在/etc/apt/sources.list,树莓派自己的驱动、固件、专用工具在/etc/apt/sources.list.d/raspi.list(部分版本已经换成 deb822 格式的raspi.sources)。只换前者,会出现「装普通软件飞快、装树莓派专用包还是龟速」的割裂感;只换后者,系统基础包又慢。常见做法是两个都换,或者干脆统一交给镜像站提供的配置脚本来做。

2.2 注释旧行、写入新行,以及 Ctrl+O 和 Ctrl+X 的区别

原始教程里说「按 ctrl-x 保存」,这是个流传很广的笔误。nano里Ctrl+O是写入(Write Out),Ctrl+X是退出(Exit),退出时如果缓冲区有改动,它会问你Save modified buffer?,敲Y再回车也能存。两种路径都通向同一个结果,但如果你的习惯是「Ctrl+X 然后一路回车」,在某些终端下回车键会把提示跳过,文件其实没落盘,后面apt update用的还是旧源,人就开始怀疑人生。

改之前先备份,这条我从来不敢省:

# 备份两个源文件,出问题能一条命令还原,比重刷系统便宜太多 sudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak sudo cp -a /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak 2>/dev/null || true # 看看现在生效的到底是哪些行(过滤掉注释行) grep -rhs '^[^#]' /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null

cp -a的-a是归档模式,保留权限和时间戳,源文件属于 root,必须带sudo。最后那条grep的-h去掉文件名前缀、-s静默不存在的文件,'^[^#]'是「行首不是井号」的正则,正好把注释掉的行筛掉,一眼就能看出当前真正在用的是哪几个地址。如果这条命令什么都没输出,说明源被.sources格式接管了,那就要去改/etc/apt/sources.list.d/*.sources。

接着编辑。用nano也好,用脚本一次性写入也好,核心是三件事:旧行前面加#注释掉而不是删掉(留着方便对照回滚)、新地址的仓库路径要跟代号匹配、组件列表别乱删。国内镜像站的路径各家写法不同,有的是/raspbian/raspbian/,有的是/debian/,还有的只镜像了树莓派自有仓库而没镜像 Debian 主仓。路径必须照着你选的那家镜像站的官方说明写,不能照抄旧教程,这是 404 的第一大来源。

# 变量化写法,避免手抖打错;MIRROR 换成你选定镜像站的主机名 MIRROR="<mirror-host>" CODENAME="bookworm" # 用 2.1 打印出来的真实代号,别照抄这一行 sudo tee /etc/apt/sources.list.d/raspi.list >/dev/null <<EOF # 原有地址已注释保留,回滚时直接取消注释即可 # deb http://legacy.example/raspbian/raspbian/ jessie main contrib non-free rpi deb http://${MIRROR}/raspbian/raspbian/ ${CODENAME} main contrib non-free rpi EOF

tee配合sudo是往 root 文件写内容的稳妥方式,>/dev/null只是把 tee 顺手打到屏幕上的那份内容丢掉。heredoc 里的${MIRROR}和${CODENAME}会被 shell 展开,所以变量必须提前定义好。参数说明:main contrib non-free是 Debian 的三大组件区,rpi是树莓派专属区,删掉任何一个都会导致某些包「明明存在却装不上」。bookworm之后部分仓库新增了non-free-firmware组件,如果你的镜像站说明里带了它,一并加上,别自作主张精简。

2.3 apt update 之后,怎么判断这次是真通了

apt update成功和失败的区别,不在退出码,而在输出里的E:和W:。正常情况是一串Hit、Get、Ign,最后Reading package lists... Done;失败则会出现404 Not Found、Release file for ... is not valid yet、does not have a Release file这几种。把输出留存下来,比反复重跑强。

# 把更新日志落盘,然后只挑错误和警告行看 sudo apt update 2>&1 | tee /tmp/apt-update.log grep -nE '^(E|W):' /tmp/apt-update.log || echo "无 E/W 行,源基本可用"

2>&1把 stderr 并进 stdout,否则 apt 的错误信息不在管道里,tee抓不到。grep -nE '^(E|W):'只匹配行首的E:或W:,能过滤掉大量无关的Hit噪音;|| echo表示 grep 没匹配到(退出码非 0)时打印兜底提示。三种典型报错的对应关系是这样:

报错关键字大概率原因处理方向
404 Not Found仓库路径写错,或代号与镜像站支持的版本不匹配回镜像站文档核对路径,curl -I手动探一下地址
does not have a Release file目录层级不对,多一层或少一层逐段砍 URL 试,找到能返回 200 的那一层
is not valid yet板子系统时间不对,证书与 Release 校验失败先校时,再重跑 update

时间那条特别阴,树莓派没有 RTC 电池,断电量久了开机时间会飘到几年前,这时候源地址完全正确也照样报错。timedatectl看一眼就知道,sudo timedatectl set-ntp true让它在联网后自动校准。

3. 字体与 locale 拆开看:为什么装完文泉驿界面还是英文

这一步是整套流程里认知门槛最高的地方。字体包和 locale 是两个完全正交的东西:字体包回答「这台机器上有没有中文字形」,locale 回答「系统该不该用中文来显示」。两个都到位,中文才会出来;只做一个,结果就是「字能显示但界面还是英文」或者「界面语言变了但全是方块」。很多人装完字体发现没反应就放弃了,其实是漏了后面那半。

3.1 字体包解决的是「有没有字形」,先确认包名

原始教程里写的是ttf-wqy-zenhei,这是老一代 Debian 的包名。较新的发行版把它改成了fonts-wqy-zenhei,两者在部分版本里靠过渡包兼容,但不是所有镜像都保留了过渡包。稳妥的做法是先查再装,别硬套教程里的名字。

# 先看仓库里到底提供了哪些文泉驿相关的包 apt-cache search wqy # 再看具体包的版本和来源,确认它能从你刚换的源里拿到 apt-cache policy fonts-wqy-zenhei ttf-wqy-zenhei

apt-cache search是按包名和描述做关键词匹配,输出里会带一行简短说明。apt-cache policy更关键,它会打印Installed(已装版本)、Candidate(可装版本)和来源行——如果Candidate是(none),说明你换的源里根本没有这个包,那问题不在字体,回到第 2 章检查源。参数说明:同时列两个包名,是为了看清哪个是真实包、哪个只是过渡包,装真实包就行,别两个都装。

# 正黑和微米黑一起装:前者用于桌面,后者体积小、适合嵌入式场景 sudo apt install -y fonts-wqy-zenhei fonts-wqy-microhei # 刷新字体缓存,让 fontconfig 立刻感知到新字形 fc-cache -fv >/dev/null # 验证:中文字形的数量,以及默认匹配到的字体 fc-list :lang=zh | wc -l fc-match "WenQuanYi Zen Hei"

fc-cache -fv的-f强制重建、-v输出细节,重定向到/dev/null只是不想刷屏,出问题时把重定向去掉再看。fc-list :lang=zh用 fontconfig 的语言过滤器列出所有支持中文的字体,wc -l数行数——大于 0 就说明字形已经进系统了。fc-match是按名字找最接近的匹配,注意字体族名是英文的WenQuanYi Zen Hei,写中文名它认不出来。这一步通过之后,说明第一关和字形这一关都过了,剩下的纯粹是 locale 的问题。

如果fc-list :lang=zh是 0,但dpkg -l | grep wqy显示已安装,那是缓存没刷或者字体装到了非标准目录,fc-cache -fv再跑一遍,还不行就fc-list | grep -i wqy看它实际被识别成了什么名字。

3.2 locale 的生成与写入,别碰 LC_ALL

locale 这套机制分两层:第一层是系统里「生成了哪些语言环境」,第二层是「当前会话用哪一个」。locale-gen负责第一层,update-locale或环境变量负责第二层。新手最常见的错误是直接export LANG=zh_CN.UTF-8,结果一重启就没了;或者编辑/etc/default/locale写了LC_ALL=zh_CN.UTF-8,导致所有分类被强制覆盖,SSH 登录时报一堆setlocale警告。

# 1) 看当前状态:LANG 是什么,有没有 LC_ALL 在捣乱 locale # 2) 看系统里到底生成了哪些中文 locale locale -a | grep -i 'zh_CN'

locale不带参数会打印全部LC_*分类,重点看LANG=和LC_ALL=两行,后者为空才是健康的。locale -a列出的是已生成的语言环境,如果只看到C、C.UTF-8、POSIX,说明中文环境从来没被生成过——这时候你把LANG设成zh_CN.UTF-8也不会生效,系统会悄悄回退到C。

# 3) 在 locale.gen 里取消 zh_CN.UTF-8 那一行的注释(幂等,重复执行无害) sudo sed -i 's/^#\s*\(zh_CN\.UTF-8\s\+UTF-8\)/\1/' /etc/locale.gen grep -n 'zh_CN' /etc/locale.gen # 4) 真正生成,这一步会编译 locale 数据,慢一点是正常的 sudo locale-gen # 5) 写进系统默认配置,只设 LANG 和 LANGUAGE sudo update-locale LANG=zh_CN.UTF-8 LANGUAGE=zh_CN:zh

sed那条正则拆开看:^#\s*匹配行首的井号加任意空白,\(...\)是捕获组,把zh_CN.UTF-8 UTF-8原样保留,替换成不带井号的版本。\s在 GNU sed 里可用,如果报错就换成[[:space:]]*。grep -n 'zh_CN'是自检,应该看到那一行没有行首井号了。locale-gen不带参数会读/etc/locale.gen全量生成,只生成需要的语言能省不少时间。update-locale写的是/etc/default/locale,LANGUAGE=zh_CN:zh是消息翻译的优先级列表,先中文后备用,这一项不设的话,某些程序的界面文案仍然是英文。

注意:不要往/etc/default/locale里写LC_ALL。它优先级最高,会把LC_TIME、LC_NUMERIC、LC_COLLATE全部拉成中文,副作用是日期格式、小数点、排序规则一起变,脚本里解析date输出的地方会莫名其妙出错。

3.3 raspi-config 里那几个选项,本质是在改什么

sudo raspi-config是个封装脚本,它的 Localisation Options 底下那几项,做的事情和上面手敲的命令完全一致,只是多了个 TUI 界面。Locale 那一项本质是「勾选要生成的语言环境 + 写/etc/default/locale」,Timezone 写/etc/timezone并同步硬件时钟,Keyboard 改的是/etc/default/keyboard。用空格键选中、Tab 切到<Ok>回车,这套操作在 SSH 里也能跑,只是方向键偶尔会和终端快捷键打架。

# 改完之后核对它到底写了什么进去,这是最直接的证据 cat /etc/default/locale # 期望看到类似两行: # LANG=zh_CN.UTF-8 # LANGUAGE=zh_CN:zh # 再看 locale.gen 里中文那行是否已被取消注释 grep -v '^#' /etc/locale.gen | grep -i zh_CN

如果cat出来的LANG是en_GB.UTF-8或干脆没有这一行,说明 TUI 里那一步没保存成功——常见原因是勾选时只按了回车没按空格,[ ]和[*]的区别就在一个空格键。这个坑我踩过不止一次,界面看起来「点过了」,其实状态没变。核对完再往下走,能省掉一轮重启。

4. 桌面、SSH、TTY:三条链路上中文各自在哪一段断掉

同样是「中文没显示」,发生在桌面、SSH 会话、纯文本控制台这三个场景,原因完全不同。桌面看的是会话级 locale 加字体匹配,SSH 看的是服务端有没有把LANG传过来加上客户端终端字体,TTY 则受限于内核控制台字体本身的能力。搞清楚自己是在哪条链路上出问题,比盲目重装字体有效得多。

4.1 本地桌面:会话重启才生效,重启服务会踢人

桌面环境下,/etc/default/locale是登录时读取的,改完之后当前已经登录的会话不会自动刷新。所以「改完没反应」很多时候不是没生效,是会话还是老的。最稳的做法是sudo reboot,急的话重启显示管理器也行,但要知道它会把你当前的图形会话直接断掉。

# 重启显示管理器,代价是当前桌面会话被强制注销 sudo systemctl restart lightdm # 如果用的是较新的系统,服务名可能是 display-manager systemctl status display-manager --no-pager

systemctl restart对lightdm是硬重启,所有未保存的图形程序内容会丢,所以这条命令不该在写到一半的文档上执行。display-manager是个别名单元,指向当前实际使用的显示管理器,用status看一眼就知道该操作哪个名字。参数说明:--no-pager是防止输出被less接管,在脚本或窄终端里很有用。

桌面里还有一层容易被忽略:应用自己的语言设置。浏览器、编辑器这类程序有的会读LANG,有的有自己的语言偏好配置,两者不一致时就会出现「桌面菜单中文了、某个软件还是英文」。另外图标显示成方块,通常是图标主题里没有对应的中文字体回退,用fc-match -s sans-serif | head -5看回退链的前几位有没有中文字体,没有的话手动指定一次字体族就能解决。

4.2 SSH 会话:两端都要对,缺一不可

SSH 场景下中文乱码,八成不是板子的问题,而是「服务端没把 locale 传过去」或者「你本地终端字体不含中文」。SSH 协议里LANG这类环境变量需要通过SendEnv/AcceptEnv显式协商,默认是不传的,所以你会看到一个很诡异的组合:板子本地桌面全是中文,SSH 上去locale显示LANG=C。

# 服务端:确认 sshd 允许接收哪些环境变量 grep -i 'AcceptEnv' /etc/ssh/sshd_config # 客户端连接时显式发送 LANG ssh -o SendEnv=LANG pi@<host>

AcceptEnv在服务端配置里写的是允许客户端发送的变量名模式,常见默认值包含LANG LC_*。如果这一行被注释掉了,客户端发过去也会被丢弃。ssh -o SendEnv=LANG是临时在命令行覆盖客户端配置,适合排查用,长期用还是写进~/.ssh/config更省事。

如果不想依赖客户端配合,可以在服务端做兜底,但要注意兜底的写法不能覆盖用户自己的选择:

# 服务端兜底:仅在 LANG 未设置时补一个默认值,用 := 而不是 = sudo tee /etc/profile.d/zh-cn.sh >/dev/null <<'EOF' # 只在当前为空时赋值,避免覆盖客户端或用户显式设置的值 : "${LANG:=zh_CN.UTF-8}" export LANG EOF

:=和=的区别是这次操作的核心:${LANG:=x}在LANG为空或未定义时才赋值,${LANG=x}在未定义时赋值但空值不处理,而直接LANG=x是无条件覆盖。放在/etc/profile.d/下的脚本会被所有登录 shell 自动 source,heredoc 用<<'EOF'加引号是为了禁止变量在写入时被展开,否则${LANG:=...}会在写文件的那一刻就被求值成空字符串。

4.3 纯文本控制台:这一层的中文,期望值要放低

按Ctrl+Alt+F1切进去的那个黑底白字界面,是内核 framebuffer 控制台。它用的是console-setup配置的点阵字体,常见选择是 Terminus 系列,而这些字体里不含 CJK 字形。也就是说,即使 locale 和字体包全都配好了,这一层的中文大概率仍然是方块或问号——这不是配置错了,是这一层的技术栈本身不支持。

# 确认控制台编码是 UTF-8,字体配置是否合理 grep -E '^(CHARMAP|CODESET|FONT|FONTSIZE)=' /etc/default/console-setup # 重新配置键盘与控制台(TUI 里选 UTF-8 / Guess optimal / Terminus) sudo dpkg-reconfigure keyboard-configuration sudo dpkg-reconfigure console-setup sudo setupcon

CHARMAP必须是UTF-8,这是编码层的前提;FONT决定字形,FONTSIZE影响一屏能放多少字符。dpkg-reconfigure会重新走一遍该包的配置向导,setupcon是让改动立即应用到当前控制台,不用重启。这三条命令能保证「编码正确、英文显示正常」,但不能变出中文字形。真要在这一层看中文,得靠fbterm这类在 framebuffer 上自绘字形的工具,配置成本不低,日常运维更常见的做法是直接用 SSH 或图形界面,把 TTY 当成救援通道用。

5. 避坑记录:五条把系统搞到要重刷的翻车现场

下面这几条都是实际会让人卡住半天以上的,按「现象 → 原因 → 解决」写,遇到对应的现象直接对号入座,不用从头再捋一遍流程。

第一条:apt update一片 404,越更新错误越多。现象是执行后刷出一屏404 Not Found,每个源都报,但网络明明是通的。原因是把旧教程里的jessie代号和/raspbian/raspbian/路径,原封不动搬到了bookworm的系统上——代号和路径必须成对匹配,跨代混用必然 404。解决是先跑 2.1 那条命令拿到真实代号,再回镜像站文档核对路径层级,用curl -I <url>/dists/<codename>/Release手动探一次,返回 200 才写进文件。已经写错的,用备份的.bak覆盖回去,重新来一遍。

第二条:装完字体,桌面菜单还是英文,但网页中文正常了。现象很迷惑:浏览器里中文显示没问题,说明字形有了,可系统菜单始终是英文。原因是只做了「字体」这一半,LANG还停在en_GB.UTF-8或C.UTF-8,系统认为界面语言就该是英文。解决是按 3.2 走完locale-gen加update-locale两步,再用locale确认LANG=zh_CN.UTF-8,最后重启。注意locale -a里没有zh_CN.utf8时,光改LANG是无效的,系统会静默回退。

第三条:SSH 上去中文全是问号,本地桌面却好好的。现象是同一台板子,接显示器看是中文,SSH 进来ls中文文件名变成????。原因是 SSH 默认不传LANG,服务端会话拿到的是C或POSIX,加上你本地终端字体可能也不含中文,两端任一环节断掉都表现成问号。解决分两步验证:先在 SSH 里echo $LANG,是C就走 4.2 的SendEnv或profile.d兜底;LANG已经正确还乱码,就换一个含中文字形的终端字体再试,把服务端和客户端的问题分开定位。

第四条:两个源同时写,apt install报依赖冲突,装一半卡死。现象是apt update能过,但装包时提示某个包「有未满足的依赖」或者版本互相打架,严重时dpkg停在半途,之后每次操作都提示要dpkg --configure -a。原因是在sources.list和raspi.list里写了重复或版本不一致的仓库,apt 拿到同一份包的两个不同版本,解依赖时打架。解决是先sudo dpkg --configure -a把中断的事务收尾,再用apt-cache policy <包名>看这个包到底有几个来源,把多余的那一行注释掉,只保留一个版本匹配的仓库。

第五条:改完源文件重启,系统起不来,卡在登录前。现象是重启后黑屏或停在某个服务启动失败,SSH 也连不上。原因是源文件改坏之后,某次apt upgrade装上了不匹配版本的核心包,或者sources.list格式错误导致 apt 相关服务启动失败。解决只能上救援:把 SD 卡拔下来插到另一台机器,挂载后恢复.bak文件;或者用另一台机器 SSH 进去(如果网络服务还活着),sudo cp /etc/apt/sources.list.bak /etc/apt/sources.list后sudo apt install -f。这条最贵的教训是:改源之前一定备份,而且不要在同一时间既换源又做大版本升级,两件事分开做,出问题才知道是哪一步的锅。

6. 验证与回滚:重启之后用一段脚本确认三关都过了

重启完之后别急着看桌面,先用一段脚本把三关挨个验一遍,比肉眼观察靠谱。下面这段可以直接存成check-zh.sh,每次改完配置跑一次,输出的 OK/NG 就是判断依据。

#!/usr/bin/env bash # 一次性校验:源可用性、中文字形、locale 三项是否全部落地 set -u fail=0 . /etc/os-release echo "[1] 系统代号: ${VERSION_CODENAME}" echo "[2] 当前 locale:" locale | sed 's/^/ /' case "${LANG:-}" in zh_CN.UTF-8*) echo " OK: LANG 指向中文" ;; *) echo " NG: LANG 不是 zh_CN.UTF-8"; fail=1 ;; esac [ -n "${LC_ALL:-}" ] && { echo " NG: LC_ALL 被设置成了 ${LC_ALL}"; fail=1; } echo "[3] 中文字形数量:" n=$(fc-list :lang=zh 2>/dev/null | wc -l) echo " ${n} 个" [ "$n" -gt 0 ] || { echo " NG: 系统里没有可用中文字形"; fail=1; } echo "[4] apt 源检查:" if sudo apt update -qq 2>/tmp/apt.err; then echo " OK: apt update 通过" else echo " NG: 见 /tmp/apt.err" sed 's/^/ /' /tmp/apt.err | head -5 fail=1 fi [ "$fail" -eq 0 ] && echo "==> 三关全过" || echo "==> 有项目未通过,按上面的 NG 行回查" exit "$fail"

set -u让未定义变量直接报错,避免${LANG:-}之外的变量拼错却静默通过。sed 's/^/ /'只是给每行加缩进,让输出层次清楚。apt update -qq的-qq把输出压到最少,只看退出码,错误信息重定向到/tmp/apt.err备查。整段脚本的退出码就是失败项的数量标记,方便挂到开机自检里。

回滚路径也要提前想好,不然真出事只能重刷。三个层面的还原:

改坏的东西回滚命令说明
源文件sudo cp /etc/apt/sources.list.bak /etc/apt/sources.list前提是改之前备份过
localesudo update-locale LANG=C.UTF-8 LANGUAGE=先退回中性值,再重配
locale 数据sudo locale-gen --purge清空重生成,耗时较长

update-locale后面跟空值会把对应变量从文件里删掉,这是撤掉LANGUAGE的干净做法。locale-gen --purge会先清空已生成的数据再重建,只在怀疑 locale 数据损坏时用,日常回滚用不到它。

最后说个习惯。早些年我在一块板子上同时换了源、装了字体、改了 locale,重启后黑屏,因为没备份源文件,又判断不出是哪一步的问题,只能把卡拔下来重刷,一个下午就没了。从那以后我每次动sources.list之前都强制走一遍备份,并且规定自己一轮只改一类东西:先换源、验证、重启,再装字体、验证,最后动 locale。三关分开过,出问题时范围立刻缩小到刚改的那一项。另外那个check-zh.sh我也一直留着,每次配完新卡跑一遍,比凭肉眼在桌面上找中文靠谱得多。希望帮到你。

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

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进