通过 unihan 的文件来实现.
只要是 unihan 中有 kTotalStrokes 字段, 获取起笔画数.
Hash 也是非常简单清楚的, 但想到这些 unicode 其实会有一个分布规律, 就记录了一下,
利用此性质通过数组方式来获取笔画.
记录了一下 unicode 的范围
- start: [13311, 19968, 63744, 131072, 173824, 177984, 178208, 194995]
- end : [19893, 40917, 64045, 173782, 177972, 178205, 183969, 194998]
总共包括 80682 个存在笔画数的 unicode 码, 包含 CJKV.
64045-131072 中间都没有此字段, 就分了两部分.
此处使用 python3 Demo 实现, 原理非常简单: 使用数组保持笔画, 将 unicode 映射到数组 index, 即可获取对应笔画数
- def get_stroke(c):
- # 如果返回 0, 则也是在 unicode 中不存在 kTotalStrokes 字段
- strokes = []
- with open(strokes_path, 'r') as fr:
- for line in fr:
- strokes.append(int(line.strip()))
- unicode_ = ord(c)
- if 13312 <= unicode_ <= 64045:
- return strokes[unicode_-13312]
- elif 131072 <= unicode_ <= 194998:
- return strokes[unicode_-80338]
- else:
- print("c should be a CJK char, or not have stroke in unihan data.")
- # can also return 0
- strokes_path: https://github.com/helmz/Corpus/blob/master/zh_dict/strokes.txt
- "按照 unicode 顺序排列的笔画数"
来源: http://www.bubuko.com/infodetail-2589320.html