我有一个shell脚本,用于远程清理另一个系统生成的包含无效UNICODE字符的XML文件。我当前在脚本中使用此命令来删除无效字符:
perl -CSDA -i -pe's/[^\x9\xA\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]+//g;' file.xml到目前为止,这是有效的,但现在文件有新的错误,据我所知,是'xA0',发生的是我的perl命令到达文件中的那个错误,并擦除文件的其余部分。我修改了我的命令以包含xA0,但它不起作用:
perl -CSDA -i -pe's/[^\x9\xA0\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]+//g;' file.xml我也尝试过使用:
iconv -f UTF-8 -t UTF-8 -c file.xml > file2.xml但这并不能解决任何问题。它会生成一个具有相同错误的相同文件。
是否有unix命令可以完全删除所有无效的UNICODE字符?
编辑:一些十六进制输出(注意1A和A0):
3E 1A 1A 33 30 34 39 37 1A 1A 3C 2F 70
6D 62 65 72 3E A0 39 34 32 39 38 3C 2F
发布于 2019-03-19 02:46:17
您可以使用以下onliner:
perl -i -MEncode -0777ne'print encode("UTF-8",decode("UTF-8",$_,sub{""}))' file.xml您还可以使用警告来扩展它:
perl -i -MEncode -0777ne'print encode("UTF-8",decode("UTF-8",$_,sub{warn "Bad byte: @_";""}))' file.xml发布于 2019-03-19 02:47:00
A0不是有效的UTF-8序列。您遇到的错误是XML编码错误,而这个错误是字符编码错误。
A0是表示不间断空格的Unicode代码点。它也是该码点的iso-8859-1和cp1252编码。
我建议从根源上解决问题。但是如果这不可能,我建议使用Encoding::FixLatin来修复这种新类型的错误(可能是通过捆绑的fix_latin脚本)。它将正确地用C2 A0 (不间断空格的UTF8编码)替换A0。
结合您现有的脚本:
perl -i -MEncoding::FixLatin=fix_latin -0777pe'
$_ = fix_latin($_);
utf8::decode($_);
s/[^\x9\xA\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]+//g;
utf8::encode($_);
' file.xmlhttps://stackoverflow.com/questions/55226974
复制相似问题