# 基于字体字符码点的文字异常检测

**URL:** <https://forum.freemdict.com/t/topic/19316>\
**Category:** 技术交流与词典编修\
**Created:** [2023 年2 月 24 日 05:34 UTC](https://forum.freemdict.com/t/topic/19316 "2023-02-24T05:34:47Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![dust](https://forumcdn.freemdict.com/letter_avatar_proxy/v4/letter/d/c2a13f/32.png) [@dust](https://forum.freemdict.com/u/dust)\
**Post date:** [2023 年2 月 24 日 05:34 UTC](https://forum.freemdict.com/t/topic/19316/1 "2023-02-24T05:34:47Z")

</div>

## 0

本文以《新世纪日汉双解大辞典》为例，介绍一种辞典文本错字的检测方法。

## 1

近日找寻日文辞典才发现 freemdict 论坛，于[此帖](https://forum.freemdict.com/t/topic/5042)下载《辞典》后，自行改写CSS样式，变更日文字体为教科书体（UD デジタル 教科書体 N-R，Windows 10 自带字体），然而后续检查中发现个别文字字体样式有异，如图中「边」字。

 ![dict](https://forumcdn.freemdict.com/uploads/default/original/3X/c/8/c8e8950a36698cc735739cfc18a4369c4713de9f.jpeg)

原因何在？首先需要了解字体显示的回退机制（fallback）：在网页中，如果某个字符在CSS指定的字体中不存在，那么排版引擎将根据内置的预设字体作为后备显示方案。

此处，CSS样式指定的日文字体仅包含日文汉字，无法显示作为中文简体的「边」字，由于回退机制，排版引擎便以衬线字体展示，而教科书体属于手书字体，与衬线字体外观差异较大，因此十分显眼。

## 2

受此启发，想到一种辞典文字错误检测方法：可将日文字体所含字符的码点（code point）汇总成表，利用程序检测辞典中每个日文字符，若无法在汇总表中找到，则说明该字符可能不属于日文文字系统。

另，网上有民间总结的日文字符汇总7000余，也可直接制成汇总表，但教科书体所含字符数更多，有8000余，且感觉上更正式和规范，因此选用后者。

以 python 为例，制表代码如下

```python
from fontTools.ttLib import TTFont
def get_table():
    code_table = set()
    fontpath = 'UDDigiKyokashoN-R.ttc'
    font = TTFont(fontpath, fontNumber=0)   
    for cmap in font['cmap'].tables:
        code_table.update(cmap.cmap.keys())
    return code_table

```

## 3

实际执行中需要忽略一些特殊字符，虽然它们既不在字体中，也不属于日文字符，但是在辞典中大致是正常使用（粗看，涉及词条过多，无法一一校对）。

已忽略的特殊字符如下：

```plaintext
➪ © ® ¯ Å Á Æ Ø ã å æ ð õ ø ý ÿ ā ć Č č Ē ē ę ě ğ Ī ī İ Ł ł ń ň ŋ Ō ō œ ř Ś ś ş Š š ū ź ż ž ǎ ɔ ɡ ɦ ʃ ʒ ʔ ː ̣ ς ḍ Ḥ ḥ ṃ ṅ ṇ Ṛ ṛ ṣ ṭ Ẓ ẓ ộ ℥ ∶ ∼ ⋅ ⋯ ◦ ♩ ♮ ⚊ ⚋ ⺗ ⺤ ⺥ ⺩ ⺿ 〻 〽 ㊜ ㋐ ㋑

```

最终，扫描出异常字符587个，涉及异常字符的词条1756个，结果保存为 CSV 文件。

CSV 数据列依次表示：词条名称，异常字符码点，异常字符，含有异常字符的例句。

之后的工作需要人工校对，费时费力，难以独自完成，因此把 CSV 文件公开，有闲心者可逐一校对。

提醒三点注意事项：

- 有些字形与日文汉字十分相似，需细看，如繁体「擊」和日文汉字「撃」
- 可用 OpenCC 等程序自动转换一部分汉字，但如果原本是错字，那么转换后依然是错字，所以转换前仍需人工校对
- CSV 文件采用 UTF-8 编码，以制表符为分隔符，Excel 直接打开可能会乱码，网上有详细解决方案，在此不赘述

最后，感谢整理和修补《辞典》的各位。

[check\_list.zip](https://forum.freemdict.com/uploads/short-url/u3iyQV6rAqYXjlFzbpoO4Qho58H.zip) (113.0 KB)

---

<div class="post-metadata">

**Author:** ![notwind](https://forumcdn.freemdict.com/user_avatar/forum.freemdict.com/notwind/32/12353_2.png) [@notwind](https://forum.freemdict.com/u/notwind)\
**Post date:** [2023 年2 月 24 日 16:04 UTC](https://forum.freemdict.com/t/topic/19316/2 "2023-02-24T16:04:01Z")

</div>

《新世纪日汉双解大辞典》是由翻译《大辞林》的精简版——《新辞林》及其前身《辞林21》而来的。建议您用程序同样跑一遍《大辞林》，比对二者的结果。若检测出相同的字，则可从表中删去。应该能降低不少人工校对的工作量。
