当前位置: 首页 > news >正文

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

总入口:源码:处理文件格式和字符集的相关代码(3-1)-CSDN博客

目录

六、预览(正确显示文本文件)

6.1 总体逻辑

6.2 二进制显示

6.3 文本显示


六、预览(正确显示文本文件)

6.1 总体逻辑

        首先区分了二进制显示和文本显示,这是两种完全不同的方法。

        文本显示默认根据检测到的编码来显示,如果指定了编码,则跳过BOM,否则系统会根据BOM来显示(这样指定的编码就没有意义了)。

		public static string makeFileContent(string file, bool bHex, Encoding encoding, ref string state, ref Encoding realEncoding){if (bHex){。。。。。。二进制显示}else{。。。。。。文本显示}}

6.2 二进制显示

        二进制显示根据检测到的格式来处理回车换行。每个回车和换行都导致换行显示(当然,这是我懒了)。

				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 文本显示

        文本显示利用的是系统的处理文本的功能。

				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();}

(这里是文档结束)

相关文章:

  • Spring WebFlux与Quarkus实战:云原生微服务开发的两大主流框架深度解析
  • 一分钟了解机器学习
  • Linux系统启动相关:vmlinux、vmlinuz、zImage,和initrd 、 initramfs,以及SystemV 和 SystemD
  • 割点与其例题
  • 消防应急处置管理的全流程概述
  • NLP双雄争霸:GPT与BERT的生成-理解博弈——从技术分野到产业融合的深度解码
  • C++:单例模式
  • 【数据仓库面试题合集①】数据建模高频面试题及解析
  • 索恩格汽车SEG Automotive EDI 需求分析
  • Unity3D 游戏编程内存优化技巧
  • linux下tcp/ip网络通信笔记1,
  • Android 中 显示 PDF 文件内容(AndroidPdfViewer 库)
  • 7. 进程控制-进程替换
  • 科技项目验收测试对软件产品和企业分别有哪些好处?
  • 填孔即可靠:猎板PCB如何用树脂塞孔重构高速电路设计规则
  • 安装Minikube
  • 芍药BAHD酰基转移酶-文献精读128
  • Vue2项目created不执行
  • Java视频流RTMP/RTSP协议解析与实战代码
  • JavaSE基础语法之方法
  • 湖南慈利一村干部用AI生成通知并擅自发布,乡纪委立案
  • 【社论】城市更新,始终以人为核心
  • 李成钢出席中国与《数字经济伙伴关系协定》成员部级会议
  • 华东政法与复旦上医签署合作框架协议,医学与法学如何交叉融合?
  • 马上评|中学生被操场地面烫伤,谁的“大课间”?
  • 娃哈哈:调整产销布局致部分工厂停工,布局新产线可实现自主生产,不排除推新品牌