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