2017-03-11 44 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將字節解碼爲文本字符串。