首页 > 编程语言 >C#获取文本的编码格式

C#获取文本的编码格式

时间:2024-04-03 20:55:18浏览次数:28  
标签:编码 Console string 文件 C# Encoding encoding 文本

这段代码首先定义了一个方法DetectFileEncoding,它打开指定路径的文件,读取其前4096个字节(这个数量可以根据需要调整)。接着,它遍历一个包含常见编码(如UTF-8、Unicode、ASCII等)的列表,并尝试使用每个编码将读取到的字节序列解码为字符串。

请注意,此方法并非完全可靠,因为某些编码可能存在混淆情况,即不同的编码方式可能对同一字节序列产生看似合理的解码结果。此外,仅基于文件开头部分的字节进行判断可能会受到特定文本内容的影响。对于某些复杂或混合编码的情况,可能需要更复杂的算法或第三方库来提高识别准确性。不过,对于大多数常见的纯文本文件,上述代码应该能够有效地识别其编码格式。

using System;
using System.IO;
using System.Text;

namespace ConsoleApp1 {
    class Program {
        static void Main(string[] args) {
            // 检测并打印第一个文件的编码
            string encoding1 = DetectFileEncoding(@"C:\Users\LZQ\Desktop\1.csv");
            Console.WriteLine($"文件 '1.csv' 编码: {encoding1}");

            // 检测并打印第二个文件的编码
            string encoding2 = DetectFileEncoding(@"C:\Users\LZQ\Desktop\2.csv");
            Console.WriteLine($"文件 '2.csv' 编码: {encoding2}");

            Console.ReadKey();
        }

        /// <summary>
        /// 检测指定文件的编码,并返回其名称。
        /// </summary>
        /// <param name="filePath">待检测文件的路径。</param>
        /// <returns>检测到的文件编码名称。若无法确定编码,则返回null(或根据需要抛出异常)。</returns>
        private static string DetectFileEncoding(string filePath) {
            byte[] buffer = new byte[4096];
            using (FileStream fileStream = File.OpenRead(filePath)) {
                int readBytes = fileStream.Read(buffer, 0, buffer.Length);

                if (readBytes == 0) {
                    Console.WriteLine("文件为空。");
                    return null; // 或根据需要抛出异常
                }

                string detectedEncodingName = null;

                // 遍历常用编码列表,尝试解码文件内容
                foreach (var encoding in GetCommonEncodings()) {
                    try {
                        string decodedString = encoding.GetString(buffer, 0, readBytes);
                        if (!decodedString.Contains("\ufffd") && !decodedString.Contains("\\uFFFD")) {
                            // 确定编码后,将正确名称赋值给detectedEncodingName,并跳出循环
                            detectedEncodingName = encoding == Encoding.UTF8 ? "UTF-8" : encoding.EncodingName;
                            break;
                        }
                    }
                    catch (Exception ex) {
                        Console.WriteLine($"使用 {encoding.EncodingName} 解码时出错: {ex.Message}");
                    }
                }

                if (detectedEncodingName == null)
                    Console.WriteLine("无法确定文件的编码。");

                return detectedEncodingName;
            }
        }

        /// <summary>
        /// 获取常用的文本编码列表。
        /// </summary>
        /// <returns>包含常用编码的数组。</returns>
        private static Encoding[] GetCommonEncodings() {
            return new[]
            {
                Encoding.UTF8,
                Encoding.Unicode,
                Encoding.BigEndianUnicode,
                Encoding.UTF32,
                Encoding.ASCII,
                Encoding.Default // 此项结果可能因系统区域设置不同而变化
            };
        }
    }
}
View Code

运行结果

 

标签:编码,Console,string,文件,C#,Encoding,encoding,文本
From: https://www.cnblogs.com/lizhiqiang0204/p/18113496

相关文章

  • 浅谈TypeScript对业务可维护性的影响
    前言笔者认为,TypeScript是服务于业务的,核心就是提高代码的可维护性.TypeScript是把双刃剑,如果类型系统使用的不好,反而会阻碍开发,甚至最后就变成了anyScript.笔者最近在使用TypeScript的过程中,有了一点点微不足道的思考,想和大家分享、探讨.本文比较适合有真实Ty......
  • 【每日C语言】Day6——变量与操作符
    目录2.4变量4.1变量的创建4.2 变量的分类2.5算术操作符:+、-、*、/、%5.1+和-5.2 *5.3 /5.4%2.6赋值操作符:=和复合赋值6.1 连续赋值6.2复合赋值符2.7单目操作符:++、--、+、-7.1++和--7.1.1 前置++ 7.1.2 后置++7.1.3 前置--7.1.4 后置--7.2+和......
  • [6] UE C++ FlappyBird
    FlappyBird项目引入Paper2D插件//渲染资产的组件classUPaperSpriteComponent*RenderLandComponent;//资产classUPaperSprite*LandSprite;GameModeBase.h.cppUE枚举声明//枚举(用于描述状态信息)UENUM()enumEBirdStateTest//传统枚举{ EBS_Wait,//等待游戏开始......
  • Java的Scanner类、Random类、ArrayList类、String类的基本定义
    学习目标:学习Java中Scanner类、Random类、ArrayList类、String类基本定义学习内容:Scanner类Scanner功能简介用于获取外界输入,例如从键盘录入字符、数字等等…Scanner类使用前需要先导入Scanner包importjava.util.Scanner;导包后创建Scanner类对象,接上.使......
  • Codeforces Round 937 (Div. 4) D题(无脑做法)
    D.ProductofBinaryDecimals题目:提示:首先如果该数目都是1和0组成那肯定输出yes了,还有这个数如果是二进制的乘积也可以yes现在举个例子看看121=11x1114641=11x11x11x11显然也是yes,但是要如何做呢,下面介绍无脑做法。AC代码#include<bits/stdc++.h>usingnamespace......
  • 【Docker基础系列】Docker 中的各类端口详解
    【Docker基础系列】Docker中的各类端口功能示例详解源自专栏《docker常用命令系列&&k8s系列目录导航》文章目录【Docker基础系列】Docker中的各类端口功能示例详解概念端口类型分类:**容器端口(ContainerPorts)**:**宿主机端口(HostPorts)**:**随机端口(RandomPor......
  • centos系统安装ntp服务器教程
    1.概述ntp服务器主要用于企业内部设备的时间同步需求。企业内部为了安全起见会将一些设备与公网隔离,ntp服务器则可以为这些隔离的设备提供时间同步服务。2.配置2.1安装操作系统并配置ip本文以centos6为例,系统安装及ip配置略过。2.2安装ntp服务软件2.3设置开机......
  • P3038 [USACO11DEC] Grass Planting G
    原题链接题解树上区间修改加单点查询,虽然可以树状数组,但是线段树更通用一点然而线段树通常处理的是点权,可这里是边权,怎么办呢?我们可以把边权转换成点权,由于每个点的子边有若干个,但父边有且只有一个,这样我们就把边权变成边下方点的点权然后区间修改和单点求和的时候把lca的点权......
  • ERROR: No matching distribution found for pymcubes
    (pytorch3drecgan)ubuntu@ubuntu:~/lcx/3D-RecGAN-pytorch-masterv3$pipinstallpymcubesWARNING:Keyringisskippedduetoanexception:Failedtounlockthecollection!WARNING:Retrying(Retry(total=4,connect=None,read=None,redirect=None,status=None))......
  • 【Leetcode】top 100 技巧
    136只出现一次的数字给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。技巧:异或  相同为0,剩到最后的数值只出现一次;c......