跳转至

CharsetFlow

一个面向 Windows 的本地批量文本编码转换工具,用来处理 UTF-8、GB18030、Big5、SHIFT-JIS 等不同编码以及 CRLF / LF 换行符转换。

GitHub:BeyondXinXin/CharsetFlow

CharsetFlow 主界面


1 项目定位

编码问题属于那种平时不显眼,一旦遇到就非常烦的开发问题。

尤其在 Windows 下维护旧项目、第三方代码、脚本或跨平台文本时,经常会同时碰到:

  • UTF-8
  • UTF-8 BOM
  • GB18030
  • Big5
  • SHIFT-JIS
  • UTF-16 / UTF-32
  • Windows 系列编码
  • CRLF / LF

单个文件用编辑器转换很简单,但如果是整个目录、几百个源码或配置文件,就需要一个更适合批处理的工具。

CharsetFlow 就是为这个场景写的。


2 核心功能

CharsetFlow 支持文件、文件夹和拖放添加,可以递归扫描目录,并通过扩展名规则控制哪些文件参与转换。

主要能力包括:

  • BOM 编码识别
  • 无 BOM Unicode 检测
  • UTF-8 / UTF-8 BOM
  • GB18030
  • Big5
  • SHIFT-JIS
  • EUC
  • Windows / ISO 系列编码
  • 批量编码转换
  • CRLF / LF 换行符转换
  • 原位覆盖
  • 输出到指定目录
  • 原位转换前自动创建 .bak
  • 内容预览
  • 手工指定源编码
  • 异步探测
  • 转换过程中取消任务
  • 命令行模式

程序既可以当普通 GUI 工具使用,也可以直接从命令行参与脚本化处理。


3 编码检测

文本编码检测不存在一个对所有文件都百分之百可靠的算法。

CharsetFlow 没有把检测完全交给单一库,而是采用一套组合流程:

BOM
严格 UTF 校验
UTF.Unknown
严格往返校验
二进制文件排除

BOM

如果文件自身带 BOM,可以直接确认对应 Unicode 编码,这是最明确的一类情况。

严格 UTF 校验

对于没有 BOM 的文件,先检查其内容是否能够严格按照 UTF 编码解释,避免把明显合法的 UTF 文本交给概率探测器。

UTF.Unknown

对于剩余文本,再使用 UTF.Unknown 进行复合编码探测。

严格往返校验

探测出候选编码后,不只是“能解码就算成功”,还会进行严格解码、严格编码和 Unicode 往返校验,尽量避免转换过程中悄悄丢字符。

二进制排除

批量扫描目录时很容易把二进制文件一起扫进来,因此在最终纳入文本文件之前还需要做二进制排除。


4 为什么强调“不要静默损坏文件”

编码转换工具最危险的问题不是转换失败,而是:

看起来转换成功了,实际上已经有字符丢失。

如果一个编码器遇到无法表示的字符时自动使用 ? 或替代字符,程序仍然可能正常结束,但原始内容已经不可逆地损坏。

因此 CharsetFlow 对解码和编码都尽量采用严格模式,并增加往返校验。

对于原位转换,还可以自动生成 .bak 文件。

相比“尽可能转换成功”,我更希望它在无法确认安全时明确失败。


5 GUI 与 CLI

项目同时支持两种使用方式。

普通启动时进入 Windows Forms 图形界面,可以拖放文件和目录、预览内容并选择目标编码。

命令行模式可以直接用于批处理,例如:

CharsetFlow --input D:\input --target_charset "UTF-8 BOM" --target_linebreak LF --output_dir D:\output

或者原位转换:

CharsetFlow --input D:\a.txt --target_charset GB18030 --output_origin

这样既能满足偶尔手工处理,也可以放进自己的构建脚本或迁移流程。


6 技术栈

项目使用:

  • C#
  • .NET 10
  • Windows Forms
  • UTF.Unknown 2.6.0

目标平台为 net10.0-windows,最终发布为 Windows x64 自包含单文件程序。

主要工程结构:

CharsetFlow
├─ Models
├─ Services
├─ UI
├─ CliRunner.cs
├─ MainForm.cs
└─ Program.cs

GUI 和 CLI 共用底层编码识别与转换逻辑,避免形成两套实现。


7 适用场景

我主要把 CharsetFlow 用在这些场景:

  • 老项目统一转 UTF-8
  • Windows / Linux 工程换行符统一
  • 批量处理第三方源码
  • 检查某个目录里混杂的文本编码
  • 将历史 GB 系列文件迁移到 Unicode
  • 在脚本中批量转换配置文件

它并不试图替代编辑器,而是专门处理“数量多、规则统一”的文本转换任务。


8 项目总结

CharsetFlow 是一个很典型的桌面开发辅助工具。

它解决的问题不新,但如果把批量扫描、编码识别、严格校验、备份、预览、GUI 和 CLI 都做好,实际使用体验会比临时脚本稳定很多。

源码:

https://github.com/BeyondXinXin/CharsetFlow