我确信这是非常简单的,我搞砸了,但是这里有:
我正在尝试解析一般用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)
会产生相同的结果。
答案 0 :(得分:2)
请试试这个
StreamReader reader = new StreamReader(filePath, System.Text.Encoding.Unicode, true);
似乎是UTF16编码,0xFFFE是字节顺序标记
答案 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);