背景:我必须编写一个应用程序,该应用程序采用设计不佳的 EBCDIC 文件,其中包含使用 ASCII 行终止符的二进制数据,有时二进制数据恰好包含 ASCII CRLF,这会导致行拆分不正确。我需要采用这种旧文件格式并在每条记录的末尾删除 CRLF。
似乎使用StreamReader
withIBM037
编码会导致该ReadLine()
方法仅读取\r
为行尾而不是\r\n
我所期望的那样,因此我从第一个字符串(在第一个字符串之后)返回的每个字符串都ReadLine
以 LF(0A
ASCII 格式)开头。
重现问题的示例程序:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
class Program
{
static void Main(string[] args)
{
//generate example EBCDIC data
List<byte> bytes = new List<byte>();
Encoding EBCDIC = Encoding.GetEncoding("IBM037");
bytes.AddRange(Encoding.Convert(Encoding.ASCII, EBCDIC, Encoding.ASCII.GetBytes("Some nice ascii text")));
bytes.AddRange(new byte[] { (byte)'\r', (byte)'\n' });
bytes.AddRange(Encoding.Convert(Encoding.ASCII, EBCDIC, Encoding.ASCII.GetBytes("Some more nice ascii text")));
//read it using StreamReader
using(MemoryStream ms = new MemoryStream(bytes.ToArray()))
using (StreamReader reader = new StreamReader(ms, EBCDIC))
{
string line = string.Empty;
while ((line = reader.ReadLine()) != null)
{
EBCDIC.GetBytes(line).ToList().ForEach(c => Console.Write(c));
Console.WriteLine();
}
}
Console.ReadLine();
}
}
输出应如下所示:
226150148133641491371311336412916213113713764163133167163
1022615014813364148150153133641491371311336412916213113713764163133167163
第二行开头的 10 不应该在那里,因为那是 CRLF 序列中的 LF。
我对ReadLine
方法的理解是:
行定义为字符序列后跟换行符 ("\n")、回车符 ("\r") 或回车符后紧跟换行符 ("\r\n")。返回的字符串不包含终止的回车符或换行符。来源
它没有说明任何关于编码改变的内容,因此它应该读取我数据中的完整 CRLF 而不仅仅是 CR。
更新:我已经解决了这个问题并实现了我自己的数据读取方法,但我的问题仍然如下:为什么没有ReadLine
按照锡上所说的去做?