[开发技巧] 如何获取汉字笔画数?

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 在开发卜筮小脚本时遇到获取汉字笔画数的需求,起初尝试使用`pypinyin`库却未得理想结果。经过探索,发现Unicode联盟维护的Unihan数据库提供准确的汉字笔画数据。通过下载Unihan数据库文件,解析其中的`kTotalStrokes`字段,利用正则表达式提取所需信息,并将其保存为JSON格式以供快速查询。最终编写函数`get_character_stroke_count`实现任意汉字笔画数的高效获取,满足了项目需求并提供了准确的数据支持。此方法不仅解决了问题,还为类似需求提供了参考方案。

[开发技巧] 如何获取汉字笔画数?

背景

在开发一个简单的卜筮小脚本的过程中,遇见了这个有趣的问题。如果只是特定个别汉字,我们大可以硬编码一个字典在脚本中,但是如果想获取任意一个汉字的笔画数呢?

pypinyin库

from pypinyin import pinyin, Style

def get_strokes_count(chinese_character):
    pinyin_list = pinyin(chinese_character, style=Style.NORMAL)
    strokes_count = len(pinyin_list[0])
    return strokes_count

character = input("请输入一个汉字:")
strokes = get_strokes_count(character)
print("汉字'{}'的笔画数为:{}".format(character, strokes))

尝试了一下,发现得到的结果实际上是该汉字在normal拼音格式下的结果数,

pypinin wrong

unihan数据库

unihan数据库是一个由Unicode联盟维护的汉字数据库,看起来很靠谱,还提供了在线的工具。

在其在线查询工具Unihan Database Lookup中进行检索,发现查询结果中
unihan_lokup
存在kTotalStrokes字段,即为所需的笔画数数据。
作为unicode的官方数据库,目前版本完全满足基本的汉字查询。

Nice! 离成功更进了一步!

从Unihan数据库中获取笔画信息

最开始打算直接通过lookup发送查询请求,hmmm,太慢了,地址在国外。发现数据库文件本身也不大,就直接下载下来了。

Unihan下载地址

打开压缩包,有文件若干.

Unihan_files.png

通过lookup检索得到的结果,我们要的kTotalStrokes字段在IRG Source中,取出该文件。
regex101中测试正则,取出要的unicode部分和笔画数部分,单独存成文件, 以供查询.

编码

  • 提取笔画信息
file = Path("Stroke/Unihan_IRGSources.txt")
output = Path("Stroke/unicode2stroke.json")
stroke_dict = dict()
with open(file,mode="r") as f:
    for line in f:
        raw_line = line.strip()
        pattern = r"(U\+.*)\skTotalStrokes.*\s(\d+)"
        result = re.findall(pattern=pattern, string=raw_line)
        if len(result) == 0:
            continue
        unicode_key = result[0][0]
        unicode_stroke = result[0][1]
        print(f"{unicode_key}: {unicode_stroke}")
        stroke_dict[unicode_key] = unicode_stroke

with open(file=output, mode="w", encoding="utf-8") as f:
    json.dump(stroke_dict,f, ensure_ascii=False, indent=4)

导出成json文件方便访问

  • 编写获取函数
with open(output) as f:
    unicode2stroke = json.load(f)

def get_character_stroke_count(char: str):
    unicode = "U+" + str(hex(ord(char)))[2:].upper()
    return int(unicode2stroke[unicode])

test_char = "阿"
get_character_stroke_count(char=test_char)

在获取时,注意unicode将汉字转为其对应的十六进制码

成功!达到预期结果!

相关文章
|
C++
推荐一款vscdoe中免费且能够快速将中文转英文变量的编程效率插件!
推荐一款vscdoe中免费且能够快速将中文转英文变量的编程效率插件,能够在日常编程办公中,助力你的编程效率,让你摆脱想英文变量名的烦恼!
249 0
|
搜索推荐 Linux C++
推荐一款utools中免费的中文转英文代码变量的编程效率工具
一款utools软件内使用的免费中文转英文代码变量命名工具,能够在日常编程办公中,助力你的编程效率,让你摆脱想英文变量名的烦恼!
148 0
显隐术:如何阅读由零宽字符写的信息?
显隐术:如何阅读由零宽字符写的信息?
178 0
微信默认表情符号的代码对照表
在微信用户可以发送表情符号,如下图: 这些符号公众平台是将其处理成文本,下面就列出微信默认表情符号代码对照表: 表情图片 字符串代码 替换关键字 /::) 微笑 /::~ 伤心 /::B 美女 /::| 发呆 /:8-) 墨镜 ...
2556 0
|
缓存 Ubuntu Linux
我手撸了一个划线翻译工具!
这里将要介绍的是一种在 Linux 平台实现的划词翻译工具,当然在考虑自己实现一个如此功能的工具前,本人也是在网上搜索了一些在 Linux 平台实现的类似的开源工具,例如 pdfTranslator,popup-dict,但它们的安装和配置都显得比较麻烦,而且使用起来也并不方便。
145 0
|
定位技术
记录平时编程或者阅读英文文档的时候不认识的英文单词
记录平时编程或者阅读英文文档的时候不认识的英文单词
175 0
|
设计模式 Java 关系型数据库
阿里Java编码手册实战详解-命名规范篇
阿里Java编码手册实战详解-命名规范篇
961 0
|
程序员 Java
程序员面试时用中文命名写白板代码的好处
在程序员面试时的白板写代码这关用中文命名对双方的好处
705 0