C#获取文本的编码格式

这段代码首先定义了一个方法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

运行结果

 

posted @ 2024-04-03 20:54  阿坦  阅读(265)  评论(0编辑  收藏  举报