解析特殊的新线

时间:2009-11-26 07:07:24

标签: c# parsing unicode

我确信这是非常简单的,我搞砸了,但是这里有:

我正在尝试解析一般用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)会产生相同的结果。

3 个答案:

答案 0 :(得分:2)

请试试这个

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

似乎是UTF16编码,0xFFFE是字节顺序标记

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

答案 1 :(得分:2)

嗯... 0x0D000D0A?

你的行尾确实看起来很笨拙。您可能需要通过Stream手动解析它...我原本期望0x0D000A000? (因为这是小端)。我想知道非Unicode进程是否已经完成了“替换lf with crlf”扫描并将其搞砸了。您当然可以这样做,并且(以两个为一的块处理字节)将0D0A替换为0A00(仅从偶数字节开始)。但从非破坏数据开始总是一个更好的选择...


是:

0xFFFE是一个BOM,因此涉及StreamReader等的任何内容(例如File.OpenText)都应自动处理并选择正确的编码。如果没有,请给它一个线索:

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

答案 2 :(得分:1)

我猜你实际上正在使用StreamReader,因为TextReader是一个抽象类。

根据您的描述,您的文本是UTF-16,但StreamReader默认为UTF-8。构建StreamReader时,需要告诉它使用UTF-16:

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