簡體   English   中英

解析特殊的換行符

[英]Parsing Peculiar Newlines

我敢肯定,這很簡單,我會搞砸,但這是:

我正在嘗試解析通常以UNICODE格式設置的日志文件(我會自由地承認,我通常對UNICODE不太了解,但是文件的前兩個字節為0xFFFE,並且每個字節之間為零其他字符)。 奇怪的是,該文件似乎以字節序列0x0D000D0A結束,即\\ r \\ 0 \\ r \\ n,這顯然使我的TextReader無法讀取它。

也就是說,我打印的所有其他行都充滿了:

?????????????????? ???????????? ?      ?????????  ? ?????????????  ? ?????????????? ???? ??? ????? ???????????????????? ??? ???????????? ????????????????? ?????????????????????? ???????????????????? ?????? ????????????????????? ????????????? ?????

對我而言,使用C#解析此內容的推薦方法是什么? 或更確切地說,我在做什么錯?

謝謝!

更新:對不起,我應該在最初的發布中就包含了我使用的代碼。 這里是:

FileStream fsa = File.Open(@"C:\InboxLOG.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
TextReader sr = new StreamReader(fsa, Encoding.Unicode, true);
string line = "";
while ((line = sr.ReadLine()) != null)
{              
     Console.WriteLine(line);
}

使用StreamReader(fsa)會產生相同的結果。

請嘗試這個

StreamReader reader = new StreamReader(filePath, System.Text.Encoding.Unicode, true);

好像是UTF16編碼,0xFFFE是字節順序標記

http://en.wikipedia.org/wiki/Byte_order_mark

嗯... 0x0D000D0A?

您的行結尾確實看起來很悶。 您可能必須通過Stream來更手動地對其進行解析...我期望使用0x0D000A000? (因為這是小端)。 我想知道非Unicode進程是否完成了“用crlf替換lf”掃描並將其處理掉。 您當然可以做同樣的事情,並且(以兩個為塊處理字節)將0D0A替換為0A00(僅從偶數字節開始)。 但是從不損壞的數據開始總是一個更好的選擇。


原為:

0xFFFE是BOM,因此涉及StreamReader等的任何事物(例如File.OpenText )都應自動處理此問題並選擇正確的編碼。 如果沒有,請提供線索:

using(var reader = new StreamReader(path, Encoding.Unicode)) {
    ...
}

我猜您實際上正在使用StreamReader,因為TextReader是一個抽象類。

根據您的描述,文本為UTF-16,但StreamReader默認為UTF-8。 構造StreamReader時,需要告訴它使用UTF-16代替:

new StreamReader(..., System.Text.Encoding.Unicode);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM