[英]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)//g
類s/ (?= |\\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.