iconv使用US-ASCII//TRANSLIT无法转换重音字母问题求助
解决iconv无法转换重音字母的问题
问题根源
你的iconv无法转换重音字母(如é、á),核心原因是系统中未安装当前环境变量指定的en_US.UTF-8 locale。从locale -a输出可见,系统仅提供C、C.UTF-8、POSIX三种locale,而LANG和LC_*参数强制使用不存在的en_US.UTF-8,导致iconv的//TRANSLIT功能无法加载正确的字符转写规则,只能用?占位。
LC参数快速说明
LC_CTYPE: 控制字符分类、大小写转换及字符转写规则(TRANSLIT依赖此参数)LC_ALL: 优先级最高,覆盖所有LC_*参数的设置LANG: 所有LC_*参数的默认值,仅当对应LC_*未单独设置时生效
修复方案
方案1:临时指定可用locale执行iconv
直接在iconv命令前设置LC_ALL为系统存在的C.UTF-8,即可让TRANSLIT正常工作:
LC_ALL=C.UTF-8 iconv -f UTF-8 -t US-ASCII//TRANSLIT//IGNORE sample1.xml -o sample2.xml
执行后,André会转为Andre,Marchán转为Marchan,其他特殊字符也能按预期转换。
方案2:安装缺失的en_US.UTF-8 locale(永久解决)
如果需要长期使用en_US.UTF-8 locale,执行以下命令安装:
sudo dpkg-reconfigure locales
在弹出的配置界面中,勾选en_US.UTF-8并确认生成。安装完成后,重新登录系统或执行source /etc/default/locale,后续iconv命令无需额外设置即可正常转换重音字母。
补充:带BOM的UTF-8文件处理
若输入文件的UTF-8 BOM影响转换,可先用sed移除BOM后再转:
LC_ALL=C.UTF-8 sed '1s/^\xef\xbb\xbf//' sample1.xml | iconv -f UTF-8 -t US-ASCII//TRANSLIT//IGNORE -o sample2.xml
内容的提问来源于stack exchange,提问作者Achiral
相关产品推荐
相关产品推荐

