因此,我有一個迭代器對象返回行,稍後解碼爲迭代器不知道編碼。一切都好,直到我試圖添加UTF-16支持。從基於行的迭代器解碼帶有CRLF行結尾的UTF-16
這裏是我的粗略代碼:
use Encode qw(decode);
my @lines;
my $buffer = '';
while($buffer .= $iter->next){
push @lines, decode("UTF-16LE", $buffer, Encode::FB_QUIET);
}
的數據是小端的UTF-16 CRLF行結束。以下是通過od -a
泵送的第一行:
0000000 ff fe e nul m nul a nul i nul l nul ht nul l nul
0000020 a nul n nul g nul u nul a nul g nul e nul ht nul
0000040 e nul x nul a nul m nul p nul l nul e nul _ nul
0000060 t nul e nul x nul t nul cr nul nl nul
,我已經得到的問題是,我最終的結局分割線。第一行以CR結束,第二行以LF開頭,依此類推。
任何想法這裏發生了什麼,以及如何解決它?
編輯:
在仔細檢查,發生了什麼是基於行的迭代器返回的一切行動和包括LF,但(重要)NOT後的空字節。 decode()
設置爲僅讀取緩衝區中的字符,因此下一次將唯一的LF保留在緩衝區中。下一次迭代出現並將所有內容添加到包含null的下一個LF。所以你最終會在一行結尾處出現一個CR,並在下一行結尾處出現LF。
我真的不知道該怎麼辦,除了已經在上面,上面寫着從decode()
的輸出只有完整的生產線另一個緩衝區..
有什麼建議?
Yep ,謝謝,迅速得出這個結論!我認爲真正應該發生的是這些迭代器應該處理塊而不是行,直到內容被解碼。如果需要的話,我們可以將它轉換成線。具有這些意義的好處將能夠正確支持二進制數據,而不是意外地...... – Dan