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

(这里是文档结束)

相关推荐
sunriver20009 天前
【Qt】Qt Creator 19.0.0 编译输出窗口乱码问题
qt·乱码·creator 19.0.0·娉ㄦ
another heaven18 天前
【计算机 字符编码类型及其应用场景详解】
数据结构·字符编码
CORNERSTONE36520 天前
工程BOM、制造BOM、采购BOM…同一个产品为什么要维护三套BOM?
制造·bom·工程·采购
CORNERSTONE36524 天前
成本会计看BOM:从80g钢材到精密部件,9层工艺如何逐级累加成本
erp·bom·物料清单
Leo.yuan2 个月前
制造业常用BOM详解:单层BOM、多层BOM、工艺BOM、虚拟BOM
大数据·数据库·信息可视化·bom
二哈喇子!3 个月前
BOM模型
开发语言·前端·javascript·bom
Leo.yuan3 个月前
一次讲清五种常见BOM类型:工程BOM、制造BOM、计划BOM、成本BOM、服务BOM
大数据·产品运营·制造·bom
jdyzzy3 个月前
BOM是什么?如何理解BOM在整个生产管理中发挥的作用?
bom
海市公约4 个月前
JavaScript零基础入门指南:从语法到实战的核心知识点解析
javascript·ecmascript·前端开发·dom·bom·定时器与事件·js语法实战
简道云平台4 个月前
工程BOM、制造BOM、成本BOM有什么区别?三套 BOM 各自解决什么问题?
大数据·制造·bom