源码:处理文件格式和字符集的相关代码(3-3)

总入口:源码:处理文件格式和字符集的相关代码(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();
			}

(这里是文档结束)

相关推荐
zh_xuan3 天前
解决VS Code 控制台中文乱码
c++·vscode·乱码
吴声子夜歌14 天前
Java——字符编码
java·字符编码·char
深念Y17 天前
装了 PowerShell 7 还是乱码?
windows·乱码·终端·命令行
深念Y19 天前
踩坑实录:把 Windows 默认 PowerShell 换成 7.x 到底有多坑?一条龙解决指南
windows·乱码·bug·控制台·powershell·管道·流式
SNOWPIAOP21 天前
git status 出现中文乱码的解决方案等
git·乱码·postgres
管家婆客服中心1 个月前
如何在委外业务中使用BOM清单?
bom·管家婆软件·委外加工
sunriver20002 个月前
【Qt】Qt Creator 19.0.0 编译输出窗口乱码问题
qt·乱码·creator 19.0.0·娉ㄦ
another heaven2 个月前
【计算机 字符编码类型及其应用场景详解】
数据结构·字符编码
CORNERSTONE3652 个月前
工程BOM、制造BOM、采购BOM…同一个产品为什么要维护三套BOM?
制造·bom·工程·采购
CORNERSTONE3652 个月前
成本会计看BOM:从80g钢材到精密部件,9层工艺如何逐级累加成本
erp·bom·物料清单