繁体   English   中英

删除Bash中的无效非ASCII字符

[英]Remove invalid non-ASCII characters in Bash

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

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

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

问题是Perl不会意识到您的输入是UTF-8。 它假定它在字节流上运行。 您可以使用-CI标志来告诉它将输入解释为UTF-8。 并且,由于您的输出中将包含多字节字符,因此还需要告诉Perl将UTF-8写入标准输出中,您可以通过使用-CO标志来实现。 所以:

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

如果要使用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字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM