首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否从UNIX中的XML文件中删除无效的UNICODE字符?

是否从UNIX中的XML文件中删除无效的UNICODE字符?
EN

Stack Overflow用户
提问于 2019-03-19 01:30:46
回答 2查看 715关注 0票数 1

我有一个shell脚本,用于远程清理另一个系统生成的包含无效UNICODE字符的XML文件。我当前在脚本中使用此命令来删除无效字符:

代码语言:javascript
复制
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,但它不起作用:

代码语言:javascript
复制
perl -CSDA -i -pe's/[^\x9\xA0\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]+//g;' file.xml

我也尝试过使用:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2019-03-19 02:46:17

您可以使用以下onliner:

代码语言:javascript
复制
perl -i -MEncode -0777ne'print encode("UTF-8",decode("UTF-8",$_,sub{""}))' file.xml

您还可以使用警告来扩展它:

代码语言:javascript
复制
perl -i -MEncode -0777ne'print encode("UTF-8",decode("UTF-8",$_,sub{warn "Bad byte: @_";""}))' file.xml
票数 1
EN

Stack Overflow用户

发布于 2019-03-19 02:47:00

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

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

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

结合您现有的脚本:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55226974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档