使用Iconv TRANSLIT去除重音字符异常:变音符偏移求助
解决iconv转换重音字符时保留变音符的问题
你遇到的问题是iconv的//TRANSLIT//ignore选项会将带重音的字符转换为「基础字母+变音符标记」的组合,而非直接移除重音得到纯ASCII字母。以下是几种可行的解决方案:
方案1:使用Perl Unicode处理(推荐,支持全量重音字符)
利用Perl的Unicode标准化模块,将带重音的字符分解为基础字母和非间距标记,再移除标记:
texto=$(echo "$text" | perl -MUnicode::Normalize -pe 'NFKD($_); s/\p{NonspacingMark}//g')
- 原理:
NFKD(Normalization Form KD)会把复合字符(如Á)拆分为基础字母A和独立的重音标记,随后用正则\p{NonspacingMark}匹配并移除所有非间距标记。
方案2:Sed字符映射(适合固定场景)
直接通过字符替换表,将指定带重音字符映射为无重音字母:
texto=$(echo "$text" | sed -e 'y/ÁÀÂÄáàâäÉÈÊËéèêëÍÌÎÏíìîïÓÒÔÖóòôöÚÙÛÜúùûüÇçÃãÕõÊê/AAAAaaaaEEEEeeeeIIIIiiiiOOOOooooUUUUuuuuCcAaOoEe/')
- 优点:无需额外依赖,适合你给出的输入场景;
- 缺点:若有更多特殊重音字符,需要手动扩展替换表。
方案3:Iconv配合Sed清理标记
保留原iconv命令,再通过Sed移除生成的变音符标记:
texto=$(echo "$text" | iconv -f UTF-8 -t us-ASCII//TRANSLIT//ignore | sed "s/['^~]//g")
- 原理:先让iconv完成转写,再用Sed过滤掉
'、^、~这类变音符标记符号。
以上三种方案针对输入ÁÁÁÁÉÉÇÇãõê,均可输出期望的AAAAEECCaoe。
内容的提问来源于stack exchange,提问作者Raquel de matos mauricio
相关产品推荐
相关产品推荐

