Skip to content

[0881] 支持 CJK 扩展区字符的正确识别与渲染 - #4204

Merged
da-liii merged 1 commit into
mainfrom
ty/0881
Aug 6, 2026
Merged

[0881] 支持 CJK 扩展区字符的正确识别与渲染#4204
da-liii merged 1 commit into
mainfrom
ty/0881

Conversation

@AXeonV

@AXeonV AXeonV commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

[0881] 支持 CJK 扩展区字符的正确识别与渲染

1 相关文档

2 任务相关的代码文件

  • lolly/lolly/data/unicode.cpp — 重构并补全 is_cjk_unified_ideograph_code 以支持 Extension A–J 等全套 CJK 扩展区,修复十六进制字符串字典序判定逻辑为 from_hex 数值比较
  • lolly/tests/lolly/data/unicode_test.cpp — 新增覆盖全部 CJK 扩展、标点、边界以及非 CJK 负面测试的单元测试

3 如何测试

3.1 确定性测试(单元测试)

xmake f --enable_tests=y && xmake test && xmake f --enable_tests=n

3.2 非确定性测试(交互验证)

在文档中粘贴或手动输入 <#20E4C> 字符(𠹌),能正确路由到 CJK 字体,且能正常渲染。

4 What

  • 粘贴或输入 CJK 扩展区汉字(如 U+20E4C 即粤语 𠹌 字)时,显示为红色的 <#20E4C> 占位符。
  • 期望:能自动识别此类 CJK 扩展区及兼容区字符,并成功 fallback 到系统默认的中文字体正常渲染。

5 Why

  • 之前 unicode_get_range 的 CJK 汉字检测范围极窄,仅硬编码匹配了基本区部分码点(0x4e000x9fcc),未涵盖 CJK Extension A–J 及兼容汉字区等现代扩展块。导致 unicode_get_range(0x20E4C) 返回空串,从而无法路由到默认中文字体。
  • is_cjk_unified_ideographs 等判定函数错误使用了十六进制字符串字面量进行字典序大小比较("4E00" <= r && r <= "9FBF"),导致 5 位十六进制码点(如 "20E4C" < "4E00",因 '2' < '4')和部分 A 区码点(首位为 '3' < '4')判定全部失效。

6 How

  • 抽离公共辅助检测:实现 is_cjk_unified_ideograph_code(int code),完整、准确支持 CJK 统一汉字基本区、各大扩展区(Extension A–J,含最新 Unicode 17.0)及兼容汉字区。
  • 重构十六进制数值判定:使用 from_hex(r) 先将内部十六进制 cork 字符串码点解析为整数,再进行区间比较,彻底修复了 5 位码点与特殊分区的判定逻辑。
  • 补全测试防护网:在 unicode_test.cpp 中新增了针对标点、基本区、兼容区、Extension A–J 临界点的高密度单元测试及非 CJK 负面边界测试,并验证全部通过。

@da-liii da-liii left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@da-liii
da-liii merged commit e3e23e4 into main Aug 6, 2026
7 checks passed
@da-liii
da-liii deleted the ty/0881 branch August 6, 2026 04:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants