fix: 拼音 fallback 逐字 SinglePinyin,解决词典缺失字对齐失步

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-08-13 13:42:03 +08:00
co-authored by Claude Opus 4.7
parent 1ce2ab2b24
commit 45e52af14b
4 changed files with 3084 additions and 20 deletions
+8 -8
View File
@@ -33,16 +33,16 @@ var PinyinOverrides = map[string]string{
"上屋抽梯": "shàng wū chōu tī",
"树上开花": "shù shàng kāi huā",
"反客为主": "fǎn kè wéi zhǔ",
"美人计": "měi rén jì",
"空城计": "kōng chéng jì",
"反间计": "fǎn jiàn jì",
"苦肉计": "kǔ ròu jì",
"连环计": "lián huán jì",
"美人计": "měi rén jì",
"空城计": "kōng chéng jì",
"反间计": "fǎn jiàn jì",
"苦肉计": "kǔ ròu jì",
"连环计": "lián huán jì",
"走为上计": "zǒu wéi shàng jì",
// 种子内容常用专名(扫描 seed_36_ji/*.json 的人物/场景名补充,发现多音误标就加)
"小明": "xiǎo míng",
"小虎": "xiǎo hǔ",
"朵朵": "duǒ duǒ",
"小明": "xiǎo míng",
"小虎": "xiǎo hǔ",
"朵朵": "duǒ duǒ",
"幼儿园": "yòu ér yuán",
"足球场": "zú qiú chǎng",
"游乐场": "yóu lè chǎng",
+10 -12
View File
@@ -49,19 +49,17 @@ func AnnotatePinyin(text string) string {
}
}
// 未命中汉字逐字转拼音pi 与 pinyin.Pinyin 的汉字输出顺序同步推进
args := pinyin.NewArgs()
args.Style = pinyin.Tone
all := pinyin.Pinyin(string(runes), args)
pi := 0
for idx, r := range runes {
if !unicode.Is(unicode.Han, r) {
continue
// 未命中汉字逐字转拼音:词典缺失字(生僻字等)SinglePinyin 返回空串,
// 该字自然保持 "",后续字不错位
args := pinyin.Args{Style: pinyin.Tone}
i := 0
for _, r := range text {
if out[i] == "" && unicode.Is(unicode.Han, r) {
if pys := pinyin.SinglePinyin(r, args); len(pys) > 0 {
out[i] = pys[0]
}
}
if out[idx] == "" && pi < len(all) && len(all[pi]) > 0 {
out[idx] = all[pi][0]
}
pi++
i++
}
b, _ := json.Marshal(out)
+14
View File
@@ -59,3 +59,17 @@ func TestAnnotatePinyin_Empty(t *testing.T) {
t.Fatal("空文本应返回 []")
}
}
func TestAnnotatePinyin_MissingDictRune(t *testing.T) {
// 词典缺失字(兙 在 CJK 范围但 go-pinyin 词典未收录)保持空串,后续字不错位
pys := parse(t, AnnotatePinyin("兙好"))
want := []string{"", "hǎo"}
if len(pys) != len(want) {
t.Fatalf("长度 %d != %d: %v", len(pys), len(want), pys)
}
for i := range want {
if pys[i] != want[i] {
t.Fatalf("第 %d 字 %q != %q", i, pys[i], want[i])
}
}
}
File diff suppressed because it is too large Load Diff