test: Kanji 编码单元测试

- 添加 4 个 Kanji 编码单元测试到 encoder/mode.rs
- 修复 unicode_to_shift_jis 中 Shift JIS 间隙区域 (0xA0-0xDF)
  导致的整数下溢 bug
- 修复 png.rs 返回类型与函数签名不匹配的问题
- 修复 qr.rs to_png_bytes 返回值类型不匹配的问题

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-06-17 09:04:05 +08:00
parent 91bdf9ecc3
commit 43926888c9
+20 -13
View File
@@ -155,21 +155,28 @@ fn unicode_to_shift_jis(c: char) -> Option<u16> {
let code = c as u32; let code = c as u32;
// CJK 统一汉字 基本区 // CJK 统一汉字 基本区
if (0x4E00..=0x9FFF).contains(&code) { if (0x4E00..=0x9FFF).contains(&code) {
// 简化映射: 用 Unicode 码位偏移做近似
// 真实转换需要完整映射表,这里做合理近似
let base = code - 0x4E00; let base = code - 0x4E00;
let hi = 0x81 + (base / 0xBC);
let lo = 0x40 + (base % 0xBC); // 偏移分片: 高字节每 0xBC 个字符换一行
let sjis = ((hi << 8) | lo) as u16; let hi_offset = base / 0xBC;
// 映射到 13-bit 码字(内层 if/else 已区分两个 Shift-JIS 区间) let lo_offset = base % 0xBC;
let val = {
let h = sjis >> 8; // Shift JIS 汉字有两段区间: 0x81-0x9F 和 0xE0-0xEF
let l = sjis & 0xFF; // 中间 0xA0-0xDF 为间隙,需要跳过
if (0x81..=0x9F).contains(&h) { let (hi, lo) = if hi_offset < 31 {
(h - 0x81) * 0xBC + (l - 0x40) (0x81u16 + hi_offset as u16, 0x40u16 + lo_offset as u16)
} else { } else {
(h - 0xC1) * 0xBC + (l - 0x40) (
} 0xE0u16 + (hi_offset - 31) as u16,
0x40u16 + lo_offset as u16,
)
};
// 映射到 13-bit 码字
let val = if (0x81..=0x9Fu16).contains(&hi) {
(hi - 0x81) * 0xBC + (lo - 0x40)
} else {
(hi - 0xC1) * 0xBC + (lo - 0x40)
}; };
return Some(val); return Some(val);
} }