总入口:源码:处理文件格式和字符集的相关代码(3-1)-CSDN博客
目录
[6.1 总体逻辑](#6.1 总体逻辑)
[6.2 二进制显示](#6.2 二进制显示)
[6.3 文本显示](#6.3 文本显示)
六、预览(正确显示文本文件)
6.1 总体逻辑
首先区分了二进制显示和文本显示,这是两种完全不同的方法。
文本显示默认根据检测到的编码来显示,如果指定了编码,则跳过BOM,否则系统会根据BOM来显示(这样指定的编码就没有意义了)。
cs
public static string makeFileContent(string file, bool bHex, Encoding encoding, ref string state, ref Encoding realEncoding)
{
if (bHex)
{
。。。。。。二进制显示
}
else
{
。。。。。。文本显示
}
}
6.2 二进制显示
二进制显示根据检测到的格式来处理回车换行。每个回车和换行都导致换行显示(当然,这是我懒了)。
cs
state = "HEX";
FileResult fileResult = ProcessFile(file, true);
FileStream filestream = new FileStream(file, FileMode.Open, FileAccess.Read);
byte[] data = new byte[filestream.Length];
filestream.Read(data, 0, (int)filestream.Length);
filestream.Close();
StringBuilder sb = new StringBuilder();
bool linehead = true;
int charWidth = 1;
int pos = 0;
if (fileResult.isUTF16)
{
charWidth = 2;
pos = (fileResult.isBigEndian ? charWidth - 1 : 0);
}
if (fileResult.isUTF32)
{
charWidth = 4;
pos = (fileResult.isBigEndian ? charWidth - 1 : 0);
}
for (int i = 0; i < data.Length; i += charWidth)
{
int sum = 0;
for (int j = 0; j < charWidth; ++j)
{
string str = Convert.ToString(data[i + j], 16);
if (!linehead) sb.Append(" ");
if (str.Length == 1) sb.Append("0");
sb.Append(str);
linehead = false;
sum += data[i + j];
}
if (sum == '\r' && data[i + pos] == '\r')
{
sb.Append(Environment.NewLine);
linehead = true;
}
if (sum == '\n' && data[i + pos] == '\n')
{
sb.Append(Environment.NewLine);
linehead = true;
}
}
return sb.ToString();
6.3 文本显示
文本显示利用的是系统的处理文本的功能。
cs
FileResult fileResult = ProcessFile(file, true);
FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
Encoding tryencoding;
if (null == encoding)
{
if (fileResult.isUTF8) tryencoding = Encoding.UTF8;
else if (fileResult.isUTF16) tryencoding = Encoding.Unicode;
else if (fileResult.isUTF32) tryencoding = Encoding.UTF32;
else tryencoding = Encoding.Default;
if (fileResult.isBigEndian)
{
if (fileResult.isUTF16) tryencoding = Encoding.GetEncoding(1201);
if (fileResult.isUTF32) tryencoding = Encoding.GetEncoding(12001);
}
}
else
{
//指定编码时跳过BOM,以免自动根据BOM改变编码
tryencoding = encoding;
int BOMsize = 0;
if (fileResult.withBOM)
{
if (fileResult.isUTF8) BOMsize = 3;
if (fileResult.isUTF16) BOMsize = 2;
if (fileResult.isUTF32) BOMsize = 4;
}
for (int i = 0; i < BOMsize; ++i)
{
fileStream.ReadByte();
}
}
StreamReader streamReader = new StreamReader(fileStream, tryencoding);
StringBuilder sb = new StringBuilder();
string content;
while ((content = streamReader.ReadLine()) != null)
{
sb.AppendLine(content);
}
realEncoding = streamReader.CurrentEncoding;
state = streamReader.CurrentEncoding.EncodingName;
if (fileResult.BOM.Length > 0) state += " BOM: " + fileResult.BOM;
else state += " BOM: NONE";
streamReader.Close();
fileStream.Close();
return sb.ToString();
}
(这里是文档结束)