易混淆字元 / 同形異義字偵測

secrets_scan 找出疑似機密的權杖、guardrail 篩檢提示注入,但沒有任何功能能抓出*視覺*仿冒:西里爾字母 "а"``(U+0430)與拉丁字母 ``"a"``(U+0061)在像素上完全相同,因此 ``"pаypal"``(其中 ``а 為西里爾字母) 對人類讀來就是 "paypal",但比較卻不相等——這正是 IDN 同形異義字釣魚與仿冒 UI 標籤的根源。

本功能參照 Unicode TR39 的概念,將易混淆字元折疊為原型*骨架*(skeleton)(兩字串骨架相同即為易混淆),並標記 混用多種文字系統的字串。純標準函式庫(unicodedata);不匯入 PySide6。每個函式皆為純函式,因此在 CI 中 完全具決定性。

無頭 API

from je_auto_control import (
    confusable_skeleton, is_confusable, detect_homoglyphs,
    is_mixed_script, scripts_of,
)

confusable_skeleton("pаypal")          # 'paypal'  (西里爾 а -> a)
is_confusable("pаypal", "paypal")      # True
detect_homoglyphs("pаypal")            # [{'index': 1, 'char': 'а', 'prototype': 'a'}]
is_mixed_script("pаypal")              # True  (拉丁 + 西里爾)
scripts_of("pаypal")                   # {'LATIN', 'CYRILLIC'}

confusable_skeleton 先以 NFKC 正規化(折疊全形、連字與數學英數字),再將每個剩餘的跨文字系統仿冒字對映到 其拉丁原型。is_confusable 僅在兩個*不同*字串骨架相同時為真。detect_homoglyphs 回傳有問題的字元連同其 位置與原型。scripts_of / is_mixed_script 依 Unicode 區塊將字元分類(忽略數字、標點與空白),因此可單獨 標記一個混用文字系統的權杖。

執行器命令

AC_confusable_scan 對單一字串回傳 {skeleton, homoglyphs, mixed_script, scripts};``AC_confusable_compare`` 對一組字串回傳 {confusable}。兩者皆以 MCP 工具(ac_confusable_scan / ac_confusable_compare)以及 Script Builder 中 Data 分類下的命令提供。