为何tr命令会将单个字符替换为两个字符?
问题原因与解决方法
问题根源
GNU tr 命令是按字节而非Unicode字符处理输入的。在UTF-8编码中,字符é是由两个字节(0xC3和0xA9)组成的多字节字符。当你执行tr é e时,tr会把这两个字节分别识别为独立的"单元",并将每个字节都替换成e对应的单字节(0x65),最终输出两个e。
解决方法
如果需要正确处理Unicode字符的音译,推荐以下几种方式:
1. 使用 sed 处理单字符替换
sed 默认支持UTF-8字符(只要系统locale为UTF-8),可以直接替换整个Unicode字符:
echo é | sed 's/é/e/g'
2. 使用 iconv 结合 tr 批量去重音
先把合成式重音字符转成"基础字符+重音标记"的分解形式,再移除重音标记:
echo é | iconv -f UTF-8 -t UTF-8-MAC | tr -d '̀́̂̃̄̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̕'
注:UTF-8-MAC编码会将合成重音字符转为分解形式,后续tr -d负责移除所有重音标记字节。
3. 使用专业音译工具
比如uconv(ICU工具集组件),支持完整的Unicode音译规则:
echo é | uconv -x Any-Latin; Latin-ASCII
内容的提问来源于stack exchange,提问作者Daniel Cotter
相关产品推荐
相关产品推荐

