.Net / C# 分析文件编码 并将 各种编码格式 转为 另一个编码格式 ( 比如: GB2312→UTF-8, UTF-8→GB2312)

相关库

.Net 8

编码识别: github.com/CharsetDetector/UTF-unknown

xml 复制代码
<PackageReference Include="UTF.Unknown" Version="2.5.1" />

代码

csharp 复制代码
using UtfUnknown;

var dir_path = "D:\\Desktop\\新建文件夹2\\新建文件夹";
var dir_new_path = "D:\\Desktop\\新建文件夹2\\utf8_files";
var dir_rest_path = "D:\\Desktop\\新建文件夹2\\rest_files";

if (!Directory.Exists(dir_new_path)) Directory.CreateDirectory(dir_new_path);
if (!Directory.Exists(dir_rest_path)) Directory.CreateDirectory(dir_rest_path);

var file_path_list = Directory.EnumerateFiles(dir_path);

// 并行处理, 充分利用多核 CPU
file_path_list.AsParallel().ForAll(async file_path =>
{
    var file_info = new FileInfo(file_path);

    var file_new_path = Path.Combine(dir_new_path, file_info.Name);
    var file_rest_path = Path.Combine(dir_rest_path, file_info.Name);

    var file_bytes = await File.ReadAllBytesAsync(file_path);

    // 截取文件的开头一点数据去分析,性能好, ( 整个文件分析,大文件太慢了. )
    var file_type = CharsetDetector.DetectFromBytes(file_bytes[0..100]) ?? throw new Exception($"未知类型 {file_path}");

    if (file_type.Detected.EncodingName == "gb18030")
    {
        // gb2312 -> c# 字符串 (utf-16)
        var file_str = file_type.Detected.Encoding.GetString(file_bytes);
        // utf-8,utf-8-bom,utf-16 有一点点差异 (具体自己查)

        // WriteAllText 默认就是 UTF8 No BOM
        await File.WriteAllTextAsync(file_new_path, file_str);
        Console.WriteLine($"{file_info.Name} gb2312 -> utf8 完成");

        // 如果事先就知道所有文件是 gb2312 编码,
        // 可以直接调用解析, 无需 UtfUnknown 去识别. 性能更快

        // 注册编码 写在 for 外面, 注册一次就行
        // Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
        // 调用
        // var str = Encoding.GetEncoding("gb18030").GetString(file_bytes);
    }
    else if (file_type.Detected.EncodingName == "utf-8")
    {
        File.Copy(file_path, file_new_path);
        Console.WriteLine($"{file_info.Name} utf8 复制完成");
    }
    else
    {
        File.Copy(file_path, file_rest_path);
        Console.WriteLine($"warn: {file_info.Name} ${file_type.Detected.EncodingName} 复制完成 ");
    }
});

// 保持主线程运行
Console.ReadLine();
相关推荐
jyOverQ3 小时前
ChatGPT Windows 客户端点击无反应、有进程却没窗口?一次 MSIX 非系统盘启动卡死的完整排查
windows·chatgpt
离陌在学C#6 小时前
C# 异步编程:从 async/await 到 Task 实战指南
开发语言·数据库·c#
还是大剑师兰特6 小时前
MySQL8.0 Windows完整安装教程
windows·mysql·大剑师
redfred8 小时前
HandBrake 使用教程:开源视频压缩工具 视频太大压缩 MKV转MP4 批量转码 硬件加速 Windows/macOS/Linux
windows·开源·音视频
kakakahahahaha9 小时前
【Windows】C盘拒绝访问0x80070005的7步排查
windows·电脑·内容运营·软件需求
用户2986985301411 小时前
PDF 转 HTML 全攻略:三种方法轻松搞定网页转换
c#·html·.net
geovindu11 小时前
CSharp: State Pattern
开发语言·后端·c#·.net·状态模式·行为模式
万年咸鱼11 小时前
Java ArrayList 详解:原理、用法与实战
java·开发语言·windows
奈斯先生Vector11 小时前
本地图片识别怎么接入多模态 AI?用 Python API 理解 GPT-4o Vision 的真实工作流
开发语言·人工智能·windows·python·网络协议·http·aigc
俊昭喜喜里12 小时前
C#中的decimal
开发语言·c#