Mac OS X下sort -u输出字符集异常问题求助
为什么Mac终端执行
sort -u后输出文件编码变成unknown-8bit? 这个问题我之前在Mac上折腾过好几次,太懂那种明明输入是UTF-8,结果sort之后编码就乱掉的烦躁了!下面给你拆解原因和解决办法:
核心原因
Mac OS X自带的sort属于BSD系列工具,和你脚本里的文本处理逻辑(大概率是用Python/Perl这类默认支持UTF-8的语言)在编码处理上有本质差异:
- 终端环境编码未明确指定:虽然你的输入文件是UTF-8,但终端的
LC_*环境变量(控制字符排序、分类的系统变量)可能没设置为UTF-8模式。sort会默认使用系统区域设置的编码,如果区域设置没关联UTF-8,它就会把多字节的UTF-8字符当成单字节的未知8位字符处理。 - BSD sort的特性限制:不同于Linux上的GNU
sort(默认支持UTF-8),Mac的BSDsort需要明确告知它要处理UTF-8编码,否则会以原始字节流方式排序,破坏UTF-8的多字节结构,导致输出文件被识别为unknown-8bit。
解决办法
1. 临时快速修复(单次生效)
执行sort时手动指定UTF-8的区域设置,直接在命令前加上环境变量:
LC_ALL=en_US.UTF-8 sort -u your_input.txt > your_output.txt
或者只设置控制排序规则的LC_COLLATE变量,效果一样:
LC_COLLATE=en_US.UTF-8 sort -u your_input.txt > your_output.txt
2. 永久解决(全局生效)
把UTF-8的区域设置加到你的shell配置文件里,以后每次打开终端都会自动生效:
- 如果你用的是Bash,编辑
~/.bash_profile或~/.bashrc,添加:export LC_ALL=en_US.UTF-8 export LANG=en_US.UTF-8 - 如果你用的是Zsh(Mac默认shell),编辑
~/.zshrc,添加同样的内容。
保存后执行以下命令让设置立即生效:
# Bash用户 source ~/.bash_profile # Zsh用户 source ~/.zshrc
3. 替代方案:改用GNU sort
如果不想折腾环境变量,可以通过Homebrew安装GNU版本的sort(属于coreutils包):
brew install coreutils
安装完成后,用gsort代替系统自带的sort,GNU sort默认支持UTF-8,直接执行:
gsort -u your_input.txt > your_output.txt
验证修复效果
执行完命令后,用file工具检查输出文件的编码:
file your_output.txt
如果显示UTF-8 Unicode text,就说明修复成功了!
内容的提问来源于stack exchange,提问作者little_mice
相关产品推荐
相关产品推荐

