【问题标题】:Remove invalid UNICODE characters from XML file in UNIX?从 UNIX 中的 XML 文件中删除无效的 UNICODE 字符?
【发布时间】: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 已经过时了。谢谢。

标签: perl unix unicode


【解决方案1】:

您可以使用以下在线工具:

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

【讨论】:

    【解决方案2】:

    A0 不是有效的 UTF-8 序列。您遇到的错误是 XML 编码错误,而这个是字符编码错误。

    A0 是不间断空格的 Unicode 代码点。它也是该代码点的 iso-8859-1 和 cp1252 编码。

    我建议从源头解决问题。但如果这不可能,我建议使用Encoding::FixLatin 来修复这种新型错误(可能通过捆绑的fix_latin 脚本)。它将正确地将A0 替换为C2 A0(不间断空格的UTF-8 编码)。

    结合您现有的脚本:

    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.xml
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-16
      • 2011-05-13
      • 2015-10-29
      • 1970-01-01
      • 2018-09-03
      • 2011-03-14
      相关资源
      最近更新 更多