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

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
简介: 在开发卜筮小脚本时遇到获取汉字笔画数的需求,起初尝试使用`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将汉字转为其对应的十六进制码

成功!达到预期结果!

相关文章
|
存储 缓存 算法
[转]分布式唯一ID生成方案
分布式唯一ID生成方案
799 0
[转]分布式唯一ID生成方案
|
缓存
IDEA找不到或无法加载主类
IDEA找不到或无法加载主类
4873 0
IDEA找不到或无法加载主类
|
10月前
|
机器学习/深度学习 新能源 调度
电力系统短期负荷预测(Python代码+数据+详细文章讲解)
电力系统短期负荷预测(Python代码+数据+详细文章讲解)
773 1
|
10月前
|
缓存 安全 编译器
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
《C++面试冲刺周刊》第三期聚焦指针与引用的区别,从青铜到王者级别面试回答解析,助你21天系统备战,直击高频考点,提升实战能力,轻松应对大厂C++面试。
912 132
C++面试周刊(3):面试不慌,这样回答指针与引用,青铜秒变王者
|
域名解析 运维 网络协议
网络诊断指南:网络故障排查步骤与技巧
网络诊断指南:网络故障排查步骤与技巧
8034 7
uniapp使用路由名称跳转
【9月更文挑战第11天】在UniApp中,可通过定义路由名称实现页面跳转,需在`pages.json`中设置页面的`name`属性。使用`uni.navigateTo`等API并指定名称即可跳转,例如`name: 'detailPage'`。目标页面可在`onLoad`函数中获取传递的参数,这种方式使代码更清晰且便于维护,尤其适合大型项目。
719 2
|
前端开发 JavaScript API
2.7K star!这个汉字工具库让中文处理变得超简单,开发者必备!
是一个功能全面的汉字工具库,提供拼音转换、笔画动画、偏旁查询、成语接龙、语音合成等20+种实用功能。支持Web/Node.js/小程序多端运行,仅需简单API调用即可实现复杂中文处理,是教育类应用、输入法开发、游戏设计的瑞士军刀
549 11
|
API
手机号段查询城市免费API接口教程
此接口用于根据手机号段查询相关信息,包括城市、运营商、区号等。支持POST和GET请求,需提供用户ID、KEY及手机号段前7位作为参数。返回数据包含状态码、信息提示及详细归属信息。示例请求地址:https://cn.apihz.cn/api/ip/haoduan.php?id=88888888&key=88888888&numbers=1321993。接口免费,建议使用个人ID与KEY以独享调用频次。
686 4
|
机器学习/深度学习 JSON API
Python编程实战:构建一个简单的天气预报应用
Python编程实战:构建一个简单的天气预报应用
933 1

热门文章

最新文章