You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FreeBSD如何创建定义字符集排序规则的LC_COLLATE区域文件

修改FreeBSD系统字符集排序规则,让下划线优先于字母数字

首先,我明白你要调整的是系统范围内的排序逻辑——默认ASCII里下划线_确实卡在大写字母末尾和小写字母开头之间,要让它排到所有字母数字前面,得靠自定义locale的排序规则来实现,这确实是偏进阶的操作,咱们一步步来:

1. 准备自定义locale源文件

FreeBSD的locale定义源文件存放在/usr/share/locale/src目录下。先找一个你当前在用的locale(比如en_US.UTF-8)的源文件,复制一份作为修改基础:

cp /usr/share/locale/src/en_US.src /usr/local/etc/locale/en_US_custom.src

2. 修改排序规则(COLLATE部分)

打开刚才复制的en_US_custom.src,找到COLLATE段的排序定义。你需要把下划线_的优先级提前到所有字母和数字之前。

默认的排序里,下划线大概是在大写字母之后、小写字母之前,类似这样的结构:

<U0041>..<U005A>;<U0061>..<U007A>;<U005F>

你要把<U005F>(也就是下划线的Unicode编码)移到最前面,调整后的排序开头应该是:

<U005F>;<U0030>..<U0039>;<U0041>..<U005A>;<U0061>..<U007A>

这样就会让下划线优先于数字、大写字母、小写字母排序。

3. 编译自定义locale

用localedef命令编译修改后的源文件,生成可用的locale文件:

localedef -i /usr/local/etc/locale/en_US_custom -c -f UTF-8 en_US.UTF-8.custom

编译完成后,你可以用locale -a命令检查是否成功生成了en_US.UTF-8.custom这个locale。

4. 系统范围应用自定义locale

临时测试(先验证效果)

先在当前shell里临时设置这个locale,测试排序是否符合预期:

export LC_COLLATE=en_US.UTF-8.custom
# 测试一下排序,比如创建几个文件:
touch apple _banana cherry 1date
ls
# 正常应该显示 _banana 1date apple cherry

如果测试没问题,再考虑全局设置。

全局永久生效

要让所有用户都使用这个排序规则,需要修改/etc/login.conf文件:

  1. 找到默认的用户class(比如default段),把lang=en_US.UTF-8改成lang=en_US.UTF-8.custom
  2. 重新生成login.conf的数据库:
cap_mkdb /etc/login.conf

另外,也可以在/etc/profile或者/etc/csh.cshrc里全局设置LC_COLLATE环境变量,确保所有shell都能加载:

# 对于sh/bash/zsh,在/etc/profile里加:
export LC_COLLATE=en_US.UTF-8.custom
# 对于csh/tcsh,在/etc/csh.cshrc里加:
setenv LC_COLLATE en_US.UTF-8.custom

注意事项

  • 自定义locale会影响所有依赖系统排序的工具:ls、sort、数据库查询(比如PostgreSQL如果用系统locale的话)、文本处理工具等,一定要先充分测试
  • 如果后续系统更新,可能会覆盖默认的locale文件,但你的自定义locale在/usr/local/etc/locale下,不会被影响
  • 如果你只需要特定应用用这个排序,不需要全局设置,只需要在启动该应用前设置LC_COLLATE环境变量即可

内容的提问来源于stack exchange,提问作者Stilez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:04:59