Sign in

    opencc

    OpenCC-compatible Chinese script conversion (simplified, traditional, Taiwan, Hong Kong, Japanese shinjitai) in pure MoonBit, with no FFI.

    opencc
    chinese
    traditional-chinese
    simplified-chinese
    text-processing
    Download zip
    Author
    Version
    0.1.1
    License
    Apache-2.0
    Last updated
    6 hours ago
    Downloads
    5

    Dependencies

    #opencc.mbt

    CI Release mooncakes License

    OpenCC-compatible Chinese script conversion in pure MoonBit — no FFI, no runtime I/O, runs on wasm, wasm-gc, js and native.

    简体 ↔ 繁体 ↔ 台湾正体 ↔ 香港繁体 ↔ 日本新字体,包含词组与地区用词转换,行为对齐 OpenCC,并以 OpenCC 官方语料的一致性通过率作为验收标准。

    #安装

    moon add Ljh684/opencc # 已在 mooncakes 发布:https://mooncakes.io/docs/Ljh684/opencc

    // 按名字调用(会链入全部词典)
    let out = @config.convert("s2twp", "内存泄漏与软件优化") // Some("記憶體洩漏與軟體最佳化")

    // 只要一个方向、体积最小:import "Ljh684/opencc/config/s2twp"
    let chain = @s2twp.chain()

    moon.pkg 里需要 import { "Ljh684/opencc/config" }(或单配置包 .../config/<name>)。

    状态:开发中(WIP)。已完成:仓库骨架与 Apache-2.0 许可、上游 OpenCC 数据快照 (19 个词典 / 19 个配置 / 官方 golden 语料 + 官方 testcases 语料)、转换引擎(首字索引、 嵌套词典组、归一化 → 分词 → 逐段转换)、词典生成器(tools/gen_dict:把 26 个词典共 89817 条数据编译成内嵌文本块,其中 6 个是复刻 OpenCC 构建期生成的派生词典;SHA-256 校验与 --verify 幂等检查)、CLI 与库 API。

    官方一致性:golden 语料 5/5 逐字节通过;官方 testcases 语料覆盖全部 19 个配置、 262 例 / 583 条期望值全部逐字节复现(含 t2s、tw2s、tw2sp、hk2s、seal2t 等反方向与地区方向)。moon check 无警告,50 个测试通过 (含覆盖 89817 条词典条目的全量属性测试,以及 19 个配置的回归基线)。 见下方路线图。


    #为什么做这个

    简繁转换是中文文本处理里使用频率最高的基础能力之一:搜索索引、内容分发、跨境电商、 出版排版、语料清洗、模型训练预处理都要用到它。

    MoonBit 生态目前已经具备中文分词的移植、拼音、中文数字等能力,唯独缺简繁转换这一层; 而 OpenCC 只有 C++ 实现,无法直接用于 wasm 与边缘场景。

    简繁转换是纯计算、无网络、无平台依赖的字符串处理,非常适合编译成体积可控的 wasm 在 浏览器、边缘节点与移动端离线运行 —— 这正是 MoonBit 的主场。

    #范围

    #支持

    • OpenCC 全部 19 个官方转换配置(见下表)。
    • 词典组合语义:union 与 short_circuit。
    • 词组优先于单字的多段转换链(归一化 → 词组/单字 → 地区变体短语 → 变体字)。
    • 最大匹配分词驱动的词组替换,避免逐字转换造成的错译。
    • 非中文内容(数字、标点、拉丁字母、emoji、空白)原样保留。
    • 基本平面以外的字符(罕见汉字、小篆)按字符整体处理,不会被代理对拆开。

    #19 个内置配置

    配置说明
    s2t简体 → 繁体(通用)
    t2s繁体 → 简体
    s2tw简体 → 台湾正体
    tw2s台湾正体 → 简体
    s2twp简体 → 台湾正体(含台湾用词)
    tw2sp台湾正体 → 简体(含大陆用词)
    s2hk简体 → 香港繁体
    hk2s香港繁体 → 简体
    s2hkp简体 → 香港繁体(含香港用词)
    hk2sp香港繁体 → 简体(含大陆用词)
    t2tw繁体 → 台湾正体
    tw2t台湾正体 → 繁体(通用)
    t2hk繁体 → 香港繁体
    hk2t香港繁体 → 繁体(通用)
    jp2t日本新字体 → 繁体
    t2jp繁体 → 日本新字体
    s2seal简体 → 篆书
    seal2t篆书 → 繁体
    t2seal繁体 → 篆书

    #明确的非目标

    • 不做分词 / 词性 / 命名实体识别(见 colmugx/jieba、moonnlp)。
    • 不做拼音与输入法。
    • 暂不覆盖 OpenCC 的 staging/ 实验字典与 jieba 分词变体配置。
    • 不提供 GUI。

    #使用

    # 列出全部 19 个配置(会标出任何引用但解析不到的词典,当前为空) opencc list-configs # 文本 / 文件转换;不给 -o 时结果写到 stdout opencc -c s2twp --text "内存泄漏与软件优化" # => 記憶體洩漏與軟體最佳化 opencc convert -c s2t --input in.txt --output out.txt # 多个 -c 按顺序串联(同上游 CLI),以及整目录批量转换 opencc -c s2t -c t2s --text "内存泄漏与软件优化" opencc convert -c s2twp --input-dir corpus --output-dir converted --ext .txt # 与 OpenCC 官方语料逐字节比对:golden(5 条链)+ testcases(19 个配置) opencc verify --golden test/fixtures/golden # 同一批结果落成报告(Markdown 或 JSON),并附代码规模与数据快照 opencc verify --report docs/verification-report.md opencc verify --report docs/verification-report.json

    // 库:一次转换
    let out = @opencc.convert("s2twp", "内存泄漏与软件优化")

    // 库:复用链(构建词典索引一次,多次转换)
    let chain = @opencc.chain("s2twp")

    #与现有方案的区别

    • 生态里没有替代品:mooncakes 2648 个包中,opencc、简繁、简体、繁体、 traditional chinese、s2t、t2s 的命中数全部为 0;已有的是分词(jieba、moonnlp)、 拼音、中文数字,都不做字形与地区用词转换。
    • 与 OpenCC 语义一致且可验证:官方 golden 语料 5/5 逐字节通过,官方 testcases 语料 262 例 / 583 条期望全部复现(覆盖全部 19 个配置,含反方向与地区方向);而 OpenCC 是 C++ + 运行时二进制词典,本项目是纯 MoonBit、零 FFI、数据编译期内联,可编到 wasm / js / native。
    • 数据可审计:上游 revision、逐文件 SHA-256、gen_dict --verify 幂等校验, 连 OpenCC 构建期生成的派生词典都按上游规则复刻并留下可读文本。

    完整对比(含审阅者三分钟验证清单)见 docs/comparison.md, 一页项目说明见 docs/one-pager.md。

    #演示

    moon build examples/web --target js --release # 产出可被 JS 调用的模块 node examples/web/demo.mjs # 命令行演示 python -m http.server # 再打开 examples/web/index.html 看网页 demo

    examples/web 是一个 foreign_library 包,用 #export_name 导出 opencc_to_taiwan 与 opencc_to_simplified 两个函数(JS 侧的类型声明见构建产物 web.d.ts)。网页 demo 直接调用 编译后的模块,没有任何网络请求;产物 1.40 MB,只包含 s2twp 与 t2s 两个方向需要的词典。

    $ node examples/web/demo.mjs 内存泄漏与软件优化 → TW 記憶體洩漏與軟體最佳化 → 简 记忆体泄漏与软体最佳化 较低级别的官员由总统任命。 → TW 較低級別的官員由總統任命。 → 简 较低级别的官员由总统任命。

    #测试与验证

    层次内容命令
    正确性(oracle)OpenCC 官方 golden 语料(5 条链)+ 官方 testcases 语料(19 个配置、262 例 / 583 条期望),全部逐字节比对moon run cmd/opencc --target native -- verify
    回归锁test/fixtures/regression/:19 个配置各一份基线,锁定行为不漂移moon test --target native
    数据完整性26 个词典 / 89817 条目重新生成后与仓库逐字节一致,快照每个文件的 SHA-256 全部匹配moon run tools/gen_dict --target native -- --verify
    派生词典6 个 OpenCC 构建期派生词典(*Rev、TSCharactersExt、地区词组投影)与上游脚本逐字节等价moon test --target native -p tools/gen_dict
    属性测试89817 条词条逐条命中自身 key、分词边界、行粒度、代理对不被拆开、二次转换稳定性moon test(四个后端)
    性能中文密集 / ASCII 密集两个语料的吞吐moon run tools/bench_lookup --target native
    可核对报告上面几项的结果落成 docs/verification-report.md(19 配置覆盖、往返、数据快照、代码规模),CI 重新生成并逐字节 diff,过期即失败moon run cmd/opencc --target native -- verify --report docs/verification-report.md

    基线在行为有意变化时才更新:moon run tools/gen_baseline --target native, 理由写进提交信息(见 test/fixtures/regression/README.md)。

    #数据来源与许可

    • 本仓库的 MoonBit 代码以 Apache-2.0 发布,见 LICENSE。
    • 词典、转换配置与一致性语料派生自 OpenCC(Apache-2.0), 来源、固定 revision 与归档哈希记录在 NOTICE 与 data/opencc/REVISION。
    • 上游数据随仓库提交,项目与 CI 全流程离线可跑;data/opencc/SHA256SUMS 记录每个文件的 SHA-256,生成器与 CI 在生成代码前先校验。

    data/opencc/dictionary/ 19 个词典(单字、词组、地区变体、兼容汉字、篆书) data/opencc/config/ 19 个转换配置 + schema data/opencc/testcases/ 官方 testcases 语料(262 例,覆盖全部 19 个配置) data/opencc/SHA256SUMS 逐文件校验和 data/opencc/REVISION 上游仓库、revision、归档哈希与选择理由 data/derived/ 6 个派生词典的可审计文本(由 tools/gen_dict 复刻) test/fixtures/golden/ 官方一致性语料(1 份输入 + 10 份期望输出)

    仅在需要升级上游 revision 时刷新数据快照:

    pwsh -File scripts/fetch-opencc-data.ps1 -Revision <新 revision>

    #开发

    # 1. 安装 MoonBit 工具链(Windows) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser irm https://cli.moonbitlang.cn/install/powershell.ps1 | iex # 2. 安装 Git 并完成仓库初始化(写入本仓库的 user.name / user.email 并首次提交) winget install --id Git.Git -e pwsh -File scripts/setup-git.ps1 # 3. 编译与测试 moon check moon test # 4. 可选:刷新上游 OpenCC 数据快照(已在仓库内,仅升级 revision 时执行) # pwsh -File scripts/fetch-opencc-data.ps1 -Revision <新 revision>

    #仓库结构

    moon.mod 模块清单 data/opencc/ 上游词典与配置快照(含 REVISION / SHA256SUMS) core/ 词典、最长匹配、转换链(引擎核心) config/ 19 个内置配置的定义与其转换链 dict/ 编译期词典数据模块(由 tools/gen_dict 产出) cmd/opencc/ CLI 入口 tools/gen_dict/ 词典 → MoonBit 数据 生成器 scripts/ 环境与数据准备的 PowerShell 脚本 test/fixtures/golden/ OpenCC 官方一致性语料(验收基准) docs/ 设计文档与验收标准

    #发布新版本

    改 moon.mod 里的 version,然后 moon publish(需要先 moon login)。 已发布版本:Ljh684/opencc v0.1.1; 发布前建议先跑 moon test --target native、opencc verify 与 gen_dict --verify, 这三条分别覆盖正确性、往返与数据完整性。

    包布局遵循当前 moon new 模板:模块根目录本身就是源目录,cmd/ 放可执行包, 不再使用旧的 src/ 约定。

    #路线图

    按「一次只做一个功能、做完并验证再进下一个」推进,每个阶段对应一个可验证的提交。

    阶段目标状态
    F1 骨架仓库、Apache-2.0 许可、MoonBit 模块与三后端构建已完成
    F2 数据快照词典 / 配置 / golden 语料入库,含 revision 与逐文件 SHA-256已完成
    F3 词典生成器词典 → dict/*.mbt + manifest,--verify 幂等已完成
    F4 索引首字索引替换线性扫描,性能记录入库已完成
    F5 官方一致性配置驱动链路 + 派生词典 + 逐段转换,golden 5/5 逐字节通过已完成
    F6 CLI 与配置覆盖list-configs / convert / verify,库入口 convert(name, text)已完成
    F7 数据表示内嵌文本块 + 运行时建索引:native 测试 341 s → 7 s,解除 plain wasm 上限已完成
    F8 覆盖与属性测试全量条目属性测试、往返一致性检查、缺失词典台账、行粒度与稳定性属性已完成
    F9 按配置裁剪词典/配置各自成包:t2s 构建 259 KB、s2t 914 KB、全量 CLI 1622 KB(wasm-gc)已完成
    F10 发布已发布到 mooncakes(Ljh684/opencc v0.1.1)、GitHub Release 与演示素材已完成
    F11 可核对报告verify --report 生成 docs/verification-report.md|json,CI 重新生成后逐字节 diff已完成
    F12 补齐派生词典复刻 OpenCC 构建期生成的 6 个派生词典(*Rev、TSCharactersExt、地区词组投影),19 个配置再没有缺失的 pass已完成
    F13 官方 testcases官方 testcases 语料入库并在 verify 中逐条比对:19 个配置、262 例 / 583 条期望全部复现已完成
    F14 代理对修复修掉「非基本平面字符被吞」的引擎缺陷(切片起点落在低代理项时为空),补官方回归测试已完成

    #已知限制

    • 引擎按 UTF-16 码元切分与比较字符串;因为词典 key 与文本走同一套码元比较,匹配是一致的。 复制文本时按字符前进(core::char_width),不切开代理对——MoonBit 的字符串切片在起点 落在低代理项时会返回空视图,这点由官方 testcases(seal2t、t2s)覆盖。
    • 往返(s2twp → tw2sp、s2hkp → hk2sp)不是逐字节恒等:TWPhrasesRev 并非 TWPhrases 的精确逆(它把台湾说法映射回正向从未产生的繁体写法)。这是上游数据的性质,verify 只把 它作为观察打印;正确性由官方 testcases 判定。
    • CLI 还不支持标准输入:MoonBit 的 core 与 moonbitlang/x 目前没有标准输入 API, 加 FFI 会破坏「零 FFI」,因此先用文件与 --text;stdout 输出在以换行结尾的文本上 与输入等价,否则会补一个换行(-o 输出文件是逐字节精确的路径)。
    • cmd/opencc 需要按名字查找配置,因此会链入全部词典(wasm-gc 1622 KB)。只想做单一方向 的程序请用 config/<name> 包,例如 examples/t2s 只有 259 KB(见 docs/performance.md)。
    • docs/verification-report.* 是生成物:改动任何 .mbt 后重新跑一次 moon run cmd/opencc --target native -- verify --report <path> 即可;忘了重跑时 CI 会在 diff 这一步直接失败,因此报告不会与代码不一致。

    #许可证

    Apache License 2.0,见 LICENSE 与 NOTICE。