在Bash中删除无效的非ASCII字符

时间:2014-06-22 17:41:00

标签: bash ascii utf non-ascii-characters

在Bash中(在Ubuntu上),是否有一个删除无效多字节(非ASCII)字符的命令?

我已尝试perl -pe 's/[^[:print:]]//g'但它也删除了所有有效的非ASCII字符。

如果需要,我可以使用sedawk或类似的实用程序。

2 个答案:

答案 0 :(得分:3)

问题是Perl没有意识到你的输入是UTF-8;它假设它在一个字节流上运行。您可以使用-CI标志告诉它将输入解释为UTF-8。而且,既然你的输出中有多字节字符,你还需要告诉Perl在写入标准输出时使用UTF-8,你可以使用-CO来做旗。所以:

perl -CIO -pe 's/[^[:print:]]//g'

答案 1 :(得分:0)

如果您想要更简单的Perl替代方案,请尝试iconv,如下所示:

iconv -c <<<$'Mot\x{fc}rhead'  # -> 'Motrhead'
  • 输入和输出编码都默认为UTF-8,但可以明确指定:使用-f的输入编码(例如-f UTF8);使用-t的输出编码(例如-t UTF8) - 运行iconv -l以查看所有支持的编码。
  • -c只是丢弃输入字符。在输入编码中无效;在示例中,\x{fc}ö的单字节LATIN1(ISO8859-1)表示,在UTF8中无效(其中它表示为\x{c3}\x{b6})。

注意(在OP发现评论后):如果您的输出仍包含乱码:

  

“ (问号)或߻(包含十六进制数字的方框)”

这意味着清理后的字符串包含 - 有效 - UTF-8字符,正在使用的字体不支持。