2017-03-11 48 views
0

我有一个HTM文件。当我在记事本直接打开它,它看起来是这样的:阅读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 > 

关于问题出在哪里的任何想法?

CLARIFICATION:这些不是我的HTM文件,所以我无法控制它们或它们的创建。我收到文件并且必须处理内容。像s/ (?= |\w)//g这样的各种攻击似乎不会影响这个神秘的空白。正在生成

输出是这样的:

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

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

检查编辑器如何处理空格,换行符和内容。还请检查您在每个环境中使用的编码,或者至少发布此信息。 – curveball

+2

你是如何得到间隔输出? – George

+1

文件的编码是什么?确保它不是以UTF-16编码,或者如果是,请确保在读取时正确解码。另外,如果您向我们展示了如何实际打印数据以及在您引用的代码和打印时发生的相关事情,这可能会有所帮助。另外,通过hexdump运行脚本的输出来查看这些空间实际上是什么。 – jcaron

回答

-1

我申请s/\x0//g这显然改变了很多空成中国字。我用s/[^[:ascii:]]+//g;清理了这些。这不理想,但似乎工作。

0

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

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

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

正如其他人所说,它看起来像你的文本渲染器通过发射一个空间来看待一个零字节,从而应对UTF-16编码文本。 (我不知道它会如何处理。)人们要求你的字节有十六进制转储,这样他们可以改进猜测。如果它与UTF-16一致,即使是这样一个小样本,这也是一个很有可能的猜测。

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