WHATWG Encoding Standard 的 MoonBit 实现:label 解析、流式编解码 API,覆盖 GBK、Big5、Shift_JIS 等传统字符集
Dependencies
| 分组 | 编码 | 状态 |
|---|---|---|
| 单字节(28 种) | windows-1252(含 latin1 / ascii 等别名)、ISO-8859-2/3/4/5/6/7/8/8-I/10/13/14/15/16、windows-874/1250..1258、KOI8-R/U、IBM866、macintosh、x-mac-cyrillic | ✅ 已实现 |
| 中文 | GBK(含 gb2312 / chinese 等别名)、gb18030(含 4 字节) | ✅ 已实现 |
| 日文 | Shift_JIS | ✅ 已实现 |
| 日文 / 韩文 | EUC-JP(含 SS2/SS3)、EUC-KR | ✅ 已实现 |
| 中文(繁体) | Big5 | ✅ 已实现 |
| Unicode | UTF-8、UTF-16BE、UTF-16LE(仅解码,见下) | ✅ 已实现 |
| 其他 | ISO-2022-JP、replacement、x-user-defined | ⏸ 可裁剪,不在当前范围 |
moon add LL728/moon_encoding// moon.pkg
import {
"LL728/moon_encoding",
"moonbitlang/core/debug",
}pub fn example(bytes : Bytes) -> Unit {
// 字节 -> 文本(解码错误按规范替换为 U+FFFD)
match @moon_encoding.decode(bytes, "windows-1252") {
Ok(text) => println(text)
Err(e) => println("解码失败: " + @debug.to_string(e))
}
// 文本 -> 字节(fatal 模式:不可映射字符直接报错)
match @moon_encoding.encode("Héllo €", "windows-1252") {
Ok(out) => println("\{out.length()} 字节")
Err(e) => println("编码失败: " + @debug.to_string(e))
}
}// chunk : Bytes —— 逐块到达的字节
match @moon_encoding.Decoder::new("windows-1252") {
Ok(decoder) => {
let mut text = ""
text = text + decoder.consume(chunk) // 跨块状态在解码器内维护,任意切分结果一致
text = text + decoder.finish()
}
Err(e) => println("创建解码器失败: " + @debug.to_string(e))
}pub enum EncodingError {
UnknownLabel(String) // label 不在标准定义的 228 个之内
UnsupportedEncoding(String) // label 合法,编码尚未实现
Unmappable(Int, Int) // 编码遇不可映射字符:码点 + 字符位置
} derive(Eq, @debug.Debug)# 字节 -> UTF-8 文本
moon run cmd/main -- decode <label> <input> <output>
# UTF-8 文本 -> 目标编码字节
moon run cmd/main -- encode <label> <input> <output>
# 列出本构建支持的全部编码(WHATWG 规范名)
moon run cmd/main -- list
# 示例
moon run cmd/main -- decode windows-1252 legacy.txt utf8.txt
moon run cmd/main -- encode latin1 utf8.txt legacy.txt
moon run cmd/main -- list$ moon run cmd/main -- decode iso-2022-jp in.bin out.txt
解码失败: UnsupportedEncoding("ISO-2022-JP")
$ echo $?
1
python tools/generate_tables.py # 由 vendored 规范数据生成 label/编码表/dispatch
python tools/gen_vectors.py # 由 CPython codecs 生成差分向量
moon fmt && moon check --deny-warn && moon test| 文件 | 职责 |
|---|---|
| label.mbt | label 解析入口(ASCII 大小写不敏感匹配) |
| single_byte.mbt | 28 种单字节编码共用的表驱动编解码引擎 |
| codec.mbt | 公共 API:EncodingError、流式 Decoder、decode / encode |
| gbk.mbt | GBK/gb18030 状态机与编码器(规范 §gb18030-decoder/encoder 逐条实现) |
| utf.mbt | UTF-8 / 共享 UTF-16 状态机与 UTF-8 编码器(规范 §utf-8 / §shared-utf-16 逐条实现) |
| euc.mbt | EUC-JP / EUC-KR 状态机与编码器(规范 §euc-jp / §euc-kr 逐条实现) |
| multibyte.mbt | Big5 与 Shift_JIS 状态机与编码器(规范 §big5 / §shift_jis 逐条实现) |
| gen_label.mbt / gen_single_byte.mbt / gen_chinese.mbt / gen_big5_sjis.mbt / gen_euc.mbt | 生成物:label 表、单字节表、gb18030 与 Big5/jis0208/EUC 各索引与编码反向表(勿手改) |
| gen_w1252_vectors_wbtest.mbt | 生成物:CPython 差分黄金向量(勿手改) |
| cmd/main/ | 文件转码 CLI |
| tools/ | 规范数据 vendor、表与差分向量生成器、规范参考实现(chinese_ref.py、multibyte_ref.py、utf_ref.py,encode-map 规则单一来源) |
pub struct Decoder {
// private fields
}type DecoderStateInstall
Download zipWHATWG Encoding Standard 的 MoonBit 实现:label 解析、流式编解码 API,覆盖 GBK、Big5、Shift_JIS 等传统字符集
Dependencies