C# 解析特殊换行符

C# 解析特殊换行符,c#,parsing,unicode,C#,Parsing,Unicode,我确信这是一件非常简单的事情,我把它搞砸了,但这里有: 我试图解析一个日志文件,该文件通常采用UNICODE格式(我承认我对UNICODE不太了解,但文件的前两个字节是0xFFFE,其他每个字符之间都有一个零)。奇怪的是,这个文件似乎以字节序列0x0D000D0A结尾,也就是说,\r\0\r\n,这显然使我的文本阅读器无法读取它 也就是说,我打印的每一行都填写: ?????????????????? ???????????? ? ????????? ? ?????????????

我确信这是一件非常简单的事情,我把它搞砸了,但这里有:

我试图解析一个日志文件,该文件通常采用UNICODE格式(我承认我对UNICODE不太了解,但文件的前两个字节是0xFFFE,其他每个字符之间都有一个零)。奇怪的是,这个文件似乎以字节序列0x0D000D0A结尾,也就是说,\r\0\r\n,这显然使我的
文本阅读器
无法读取它

也就是说,我打印的每一行都填写:

?????????????????? ???????????? ?      ?????????  ? ?????????????  ? ?????????????? ???? ??? ????? ???????????????????? ??? ???????????? ????????????????? ?????????????????????? ???????????????????? ?????? ????????????????????? ????????????? ?????
对于我来说,使用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是字节顺序标记

请试试这个

StreamReader reader = new StreamReader(filePath, System.Text.Encoding.Unicode, true);
看起来像UTF16编码,0xFFFE是字节顺序标记

嗯。。。0x0D000D0A


你的行尾看起来确实有问题。您可能需要通过流更手动地解析它。。。我会期望0x0D000A000?(因为这是小恩迪安)。我想知道一个非Unicode进程是否进行了“用crlf替换lf”扫描并把它搞砸了。当然,您也可以这样做,并且(以两个块的形式处理字节)将0D0A替换为0A00(仅从偶数字节开始)。但从非损坏数据开始总是一个更好的选择


是:

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

using(var reader = new StreamReader(path, Encoding.Unicode)) {
    ...
}
嗯。。。0x0D000D0A


你的行尾看起来确实有问题。您可能需要通过流更手动地解析它。。。我会期望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);

我猜您实际上使用的是StreamReader,因为TextReader是一个抽象类

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

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

谢谢你的建议。我相应地更新了我的问题。当使用调试器检查从文件中读取的内容时,StreamReader似乎正确地使用了BOM表。我不确定这是否有帮助,但只是把它扔了出去。“我想知道一个非Unicode进程是否做了一个“用crlf替换lf”的扫描并把它搞砸了”听起来像是一个很好的猜测。也许是网络协议?ftp(没有bin)?关于行尾的问题:我实际上只是在尝试解析WinXP Pro框上的MSFax活动日志文件。由于文件有点大,我不希望每次收到传真时都要复印一份,我需要重新分析它。我会手动检查它。再次感谢!请继续建议。谢谢你的建议。我相应地更新了我的问题。当使用调试器检查从文件中读取的内容时,StreamReader似乎正确地使用了BOM表。我不确定这是否有帮助,但只是把它扔了出去。“我想知道一个非Unicode进程是否做了一个“用crlf替换lf”的扫描并把它搞砸了”听起来像是一个很好的猜测。也许是网络协议?ftp(没有bin)?关于行尾的问题:我实际上只是在尝试解析WinXP Pro框上的MSFax活动日志文件。由于文件有点大,我不希望每次收到传真时都要复印一份,我需要重新分析它。我会手动检查它。再次感谢!请继续提出建议。我接受了马克·格雷威尔的答案,因为它引导我找到了我的解决方案。很明显,在复制文件的过程中,有什么东西破坏了行的结尾。当直接在机器上阅读时,我的代码运行良好。我接受了Marc Gravell的答案,因为它引导我找到了解决方案。很明显,在复制文件的过程中,有什么东西破坏了行的结尾。当直接在机器上读取时,我的代码运行良好。