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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:24:56