繁体   English   中英

读取HTM文件:每个字符周围的神秘空白

[英]Reading HTM file: mysterious white space around every character

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

<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;

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

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

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

澄清:这些不是我的HTM文件,因此我无法控制它们或它们的创建。 我收到文件,必须处理其中的内容。 诸如s/ (?= |\\w)//gs/ (?= |\\w)//g各种攻击似乎都不会影响这个神秘的空格。

通过以下方式生成输出:

foreach (@lines) {
    $line .= "$_\n";
}

open( $fh, '>', 'output-file.txt' ) or die "Could not open file $!";
print $fh $line;
close $fh;

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

HTML文件是格式化的文本。 它们具有一种文档编码,即与文件一起编码的文档。 文档“值”是Unicode字符序列。 如果文件未使用Unicode编码,则可以将字符表示为数字字符实体(例如&#x1f6b2;而不是🚲)。 它们还具有一种指示内部编码文档的机制( meta charset ),但显然没有使用。

收到文本文件时,您还必须了解用于编写文本的编码。 如果没有,则说明通信失败。 (Web服务器和浏览器通过使用HTTP Content-Type标题相互告诉对方正在使用哪种编码来进行预防。不幸的是,由于程序将文件拖放到单个系统的文件系统中,因此过分依赖默认值或“检测” [明智的猜测]。

正如其他人所说,您的文本呈现器似乎在UTF-16编码的文本上显示了一个零字节,从而解决了这一问题。 (我想知道如何处理🚲。)人们要求对您的字节进行十六进制转储,以便改善猜测。 如果它与UTF-16一致,那将是一个极有可能的猜测,即使样本量如此之小。

解决方案很简单:与发送方确认编码为UTF-16,然后根据字节顺序将其读取为UTF-16LE或UTF-16BE。 在知道编码为UTF-16的情况下,字节顺序很容易检测。 因此,将文件作为字节字符串提取,然后使用Encode :: Unicode将字节解码为文本字符串。

我使用s/\\x0//g显然将许多空值转换为汉字。 我用s/[^[:ascii:]]+//g;清除了这些内容s/[^[:ascii:]]+//g; 这不是理想的方法,但是似乎可行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM