读取HTM文件:每个角色周围都有神秘的空白区域

时间:2017-03-11 00:02:51

标签: html regex perl

我有一个HTM文件。当我在记事本中直接打开它时,它看起来像这样:

<div class="app-img-wrapper">
  <a href="http://kenwheeler.github.io/slick/img/fonz1.png" class="app-img-link" title="Image 1"> <img src="http://kenwheeler.github.io/slick/img/fonz1.png" class="img-responsive app-img" alt="App">
    <h2 class="app-img-text">Image Text</h2>
  </a>
</div>

当我尝试在Perl中执行此操作时:

<HTML>
<BODY BGCOLOR=#FFFFFF BGPROPERTIES=FIXED>
<FONT 000000 FACE=ARIAL SIZE=3>
<HEAD>

Perl数组中的每一行现在都有这些额外的空格,如下所示:

open (my $fh, '<', $filename) or die "Error opening file! $!";
chomp(my @lines = <$fh>);
close $fh;

关于问题所在的任何想法?

澄清:这些不是我的HTM文件,所以我无法控制它们或它们的创建。我收到文件,必须处理内容。像< H T M L > < B O D Y B G C O L O R = # F F F F F F B G P R O P E R T I E S = F I X E D > < F O N T 0 0 0 0 0 0 F A C E = A R I A L S I Z E = 3 > < H E A D > 这样的各种攻击似乎并没有影响到这个神秘的空白。

以这种方式生成输出:

s/ (?= |\w)//g

2 个答案:

答案 0 :(得分:0)

没有文字,只有编码文字。每个文件都使用一个特定的字符编码编写,并且必须使用相同的编码进行读取。

HTML文件是格式化文本。他们有一个文件编码 - 编写文件的编码。文档“value”是一系列Unicode字符。如果文件不使用Unicode编码,则字符可以表示为数字字符实体(例如,&amp;#x1f6b2;而不是)。它们还有一种机制来在内部指示文档编码(meta charset),但显然没有使用。

当您收到文本文件时,您还必须知道使用哪种编码进行编写。如果你没有那个,这是一个失败的沟通。 (Web服务器和浏览器通过告诉对方使用HTTP Content-Type标题使用哪种编码来防止这种情况。不幸的是,由于程序将文件丢弃到单个系统的文件系统中,因此过多依赖默认值或“检测“[知情猜测]。”

正如其他人所说,看起来您的文本渲染器通过发出一个看到零字节的空间来处理UTF-16编码的文本。 (我想知道它将如何处理。)人们要求你的字节的十六进制转储,以便他们可以改善猜测。如果它与UTF-16一致,即使是这么小的样本,这也是一个极有可能的猜测。

解决方案很简单:与发件人确认编码是UTF-16,然后根据字节顺序将其读作UTF-16LE或UTF-16BE。考虑到编码是UTF-16的知识,字节排序很容易检测。因此,将文件作为字节字符串进行啜食,并使用Encode::Unicode将字节解码为文本字符串。

答案 1 :(得分:-1)

我应用了s/\x0//g,它显然将许多空值转换为汉字。我用s/[^[:ascii:]]+//g;清理了这些。这不是理想的,但似乎有效。