【发布时间】:2019-08-09 03:39:35
【问题描述】:
我有一个 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 字符?
编辑: 一些 HEX 输出(注意 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
【问题讨论】:
-
请提供一些相关行的十六进制转储。顺便说一句,如果
iconv没有剥离它们,它们可能不是无效的字节序列,即使它们看起来像乱码。也许通过“无效字符”来澄清您的确切含义。 -
我添加了我认为您要求的内容。 utf-8 代码点表示 A0 是无效的继续字节。无效是指删除所有非 utf-8 字符。
-
1A 是有效的 ASCII,因此是有效的 UTF-8。我的 iconv 去掉了 A0。你用的是什么版本的 iconv?
-
您可以只对整个文件进行解码/编码:
encode("UTF-8",decode("utf8",$content))错误的字符将被替换为“?” -
@jhnc 我使用的是iconv 1,现在我尝试使用iconv 2,它确实去掉了A0(呈现为
但留下了1A(呈现为^Z)。也许我错了说非 utf-8 字符。我摄取包含 1A 的 XML 的系统吐出一个错误,说“找到了一个无效的 XML 字符(Unicode 0x1A)”。看起来我应该能够使用 iconv 的组合来首先删除 A0,然后删除 1A 的 perl 脚本,现在我知道我的 iconv 已经过时了。谢谢。