在Perl中读写未知格式的XML文件?

| 我正在整理别人的大型项目,并试图纠正错误。问题是,我只是不确定正确的方法是什么。 因此,我要遍历一堆HTML页面,然后使用简单的命令将其写入文件:
$src = `curl http://google.com`;
open FILE, \">output.html\";
print FILE $src;
close FILE;
现在我希望将它们另存为UTF-8。另存为什么?然后,我将使用相同的基本\'open \'命令读取html文件,使用regex调用解析html,并使用字符串串联来创建大字符串并将其写入XML文件(使用与上述相同的代码) 。我已经开始使用XML :: Writer代替,但是现在我必须检查并修复编码不正确的文件。 因此,我不再有html了,但是我仍然有必须显示正确字符的XML。这是一个示例:http://filevo.com/wkkixmebxlmh.html 主要问题是检测并使用正确显示在编辑器中的\“ \\ x {2019} \”替换有问题的字符。但是我无法找出一个正则表达式来真正捕捉野性。 更新: 我仍然无法检测到我在上面上传到Filevo的XML文件中的ALT-0146字符。我尝试用UTF-8打开它,然后搜索/ \\ x {2019} /,/ chr(0x2019)/和/’/,什么也没有。     
已邀请:
        为了确保您正在以UTF-8格式生成输出,请使用
binmode
utf8
层应用于输出流
open FILE, \'>output.html\';
binmode FILE, \':utf8\';
或在3参数
open
通话中
open FILE, \'>:utf8\', \'output.html\'
任意输入比较棘手。如果幸运的话,HTML输入会在很早的时候告诉您其编码:
wget http://www.google.com/ -O foo ; head -1 foo

<!doctype html><html><head><meta http-equiv=\"content-type\" content=\"text/html; 
charset=ISO-8859-1\"><title>Google</title><script>window.google=
{kEI:\"xgngTYnYIoPbgQevid3cCg\",kEXPI:\"23933,28505,29134,29229,29658,
29695,29795,29822,29892,30111,30174,30215,30275,30562\",kCSI:
{e:\"23933,28505,29134,29229,29658,29695,29795,29822,29892,30111,
30174,30215,30275,30562\",ei:\"xgngTYnYIoPbgQevid3cCg\",expi:
\"23933,28505,29134,29229,29658,29695,29795,29822,29892,30111,
30174,30215,30275,30562\"},authuser:0,ml:function(){},kHL:\"en\",
time:function(){return(new Date).getTime()},
啊,有::7ѭ。现在,您可以继续将输入作为原始字节读取,并找到某种方式以已知编码对这些字节进行解码。 CPAN可以为此提供帮助。     
        很难发现HTML文档的编码。请参阅http://blog.whatwg.org/the-road-to-html-5-character-encoding,尤其是它需要一个7步算法;第4步有2个子步骤,其中第一个包括7个分支,其中一个具有8个子步骤,其中一个实际上链接到一个本身具有7个步骤的单独算法……它持续了一段时间。\“ 这是我在解析HTML文件时出于有限需求的目的。
my $CHARACTER_SET_CLASS = \'\\w:.()-\';

     # X(HT)?ML: http://www.w3.org/International/O-charset
     /\\<\\?xml [^>]*(?<= )encoding=[\\\'\\\"]?([$CHARACTER_SET_CLASS]+)/ ||
     # X?HTML: http://blog.whatwg.org/the-road-to-html-5-character-encoding
     /\\<meta [^>]*\\bcharset=[\"\']?([$CHARACTER_SET_CLASS]+)/i ||
     # CSS: http://www.w3.org/International/questions/qa-css-charset
     /\\@charset \"([^\\\"]*)\"/ ||
    
        我指的是您问题的更新部分(下次针对单独的主题打开一个新的问题)。这是文件的十六进制转储(请避免将来使助手通过燃烧的箍跳来获取示例数据):
0000  3c 78 6d 6c 3e 0d 0a 3c  70 65 72 73 6f 6e 4e 61  <xml>␍␤< personNa
0010  6d 65 3e 47 2e 20 50 65  74 65 72 20 44 61 80 41  me>G. Pe ter Da�A
0020  6c 6f 69 61 3c 2f 70 65  72 73 6f 6e 4e 61 6d 65  loia</pe rsonName
0030  3e 0d 0a 3c 2f 78 6d 6c  3e 0d 0a                 >␍␤</xml >␍␤
您说您知道角色应该是
,但完全被弄乱了。任何编码都不能为0x80。这看起来像是粘贴事故,您在编辑器/剪贴板之间传输数据,而不仅仅是处理文件。如果不是这种情况,那么您的母牛或牛人出了错,您无法在算法上纠正。     

要回复问题请先登录注册