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

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

相关库

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

<PackageReference Include="UTF.Unknown" Version="2.5.1" />

代码

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

http://www.kler.cn/a/526666.html

相关文章:

  • 电子电气架构 --- 在智能座舱基础上定义人机交互
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.26 统计圣殿:从描述统计到推断检验
  • qt内部的特殊技巧【QT】
  • gitee——报错修改本地密码
  • C# dataGridView1获取选中行的名字
  • USB 3.1-GL3510-52芯片原理图设计
  • Vue中的动态组件是什么?如何动态切换组件?
  • C 标准库 - `<errno.h>`
  • 学习笔记 ---- 平衡树 总结
  • UE求职Demo开发日志#15 思路与任务梳理、找需要的资源
  • sys中目录和文件的建立以及与驱动的交互
  • 【Block总结】LSKNet,大核卷积|即插即用
  • opencv裁剪视频区域
  • 白嫖DeepSeek:一分钟完成本地部署AI
  • Linux工具使用
  • Golang 并发机制-2:Golang Goroutine 和竞争条件
  • 【RocketMQ 存储】- broker 端存储单条消息的逻辑
  • 算法随笔_31:移动零
  • DeepSeek-R1 模型及GRPO算法学习
  • 浅谈网络 | 容器网络之Flannel
  • 21.3-启动流程、编码风格(了解) 第21章-FreeRTOS项目实战--基础知识之新建任务、启动流程、编码风格、系统配置 文件组成和编码风格(了解)
  • 雅思写作(支持句)
  • 告别重启!Vue CLI 动态代理配置实战:实现热更新与灵活配置
  • Redis实战(黑马点评)——redis存储地理信息、位图、HyperLogLog 用法
  • 【视频+图文详解】HTML基础1-html和css介绍、上网原理
  • 从零开始学习电池SOC算法