惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
C
Check Point Blog
J
Java Code Geeks
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
量子位
Google DeepMind News
Google DeepMind News
I
InfoQ
The GitHub Blog
The GitHub Blog
aimingoo的专栏
aimingoo的专栏
N
Netflix TechBlog - Medium
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
V
V2EX
Blog — PlanetScale
Blog — PlanetScale
T
The Blog of Author Tim Ferriss
小众软件
小众软件
博客园_首页
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
IT之家
IT之家

Dvel's Blog

Rime 全拼双拼混输 CHD 油猴脚本:每日签到自动答题 Rime 配置:雾凇拼音 Hammerspoon 自动切换输入法 修复 Hugo 本地图片的累计布局偏移(CLS)问题 macOS 利用 Karabiner 修改 Emacs 键位为 Vim 键位 macOS 修改 Emacs 键位为 Vim 键位 Surge 配置 汉字的混乱 Netflix 中英双语字幕的好办法 优化 Rime 英文输入体验 Cloudflare 转入域名提示「出现了问题。请重试转移此域。尚未向您收费。」 图片压缩:Squoosh、TinyPNG、ImageOptim、WebP macOS grep + sed 批量替换多个文件的内容 在 macOS 根目录创建文件夹 博客图床小妙招 折腾 Hugo & PaperMod 主题 利用 Cloudflare Workers 进行批量 301 重定向 将博客部署在 Cloudflare Pages Alfred File Navigation(文件导航器)详解 在 Hugo Goldmark Markdown 中设置以新标签打开链接 日期与时间(UTC、GMT、时间戳、时区) 让 Alfred 以新标签的方式打开 Finder 用 git filter-branch 给 Git 仓库瘦身 qBittorrent 设置教程 联通光猫破解+桥接记录 配置 Mac 终端走代理 Steam for Mac 中文游戏推荐 我的 Mac 软件/工具列表 《Flask Web 开发》笔记
判断字符是否为简体字或繁体字
Dvel · 2022-04-28 · via Dvel's Blog

判断一个字符是简体字还是繁体字。

Unicode 范围

开始以为可以用 Unicode 范围来表示,了解后发现简繁之间在 Unicode 字符集中位置存在交集,并且不是连续的,没办法用这种方法搞定。

如果真要靠这种办法,需要在茫茫字表中进行超级详细和繁杂的范围指定。

看到叶典网有一个字符集范围,但没有区分简繁。

Golang 也有一个 unicode.Han,也没有区分简繁。

Unihan_Variants.txt

http://www.unicode.org/Public/UCD/latest/ucd/ 下载 Unihan.zip,打开里面的 Unihan_Variants.txt

比如「战斗」的「斗」(繁体是「鬥」)这两行:

「斗」是 U+6597,「鬥」是 U+9B25

U+6597	kTraditionalVariant	U+9B25
U+9B25	kSimplifiedVariant	U+6597
  • kTraditionalVariant 前面是简体专用,后面是繁体专用;

  • kSimplifiedVariant 前面是繁体专用,后面是简体专用。

另外有「后U+540E、後U+5F8C」这种的字,「皇后」是简繁体通用,但表示 behind 时,简体用「后面」,繁体用「後面」。

所以就有以下这些行:

U+540E	kSimplifiedVariant	U+540E
U+5F8C	kSimplifiedVariant	U+540E
U+540E	kTraditionalVariant	U+540E U+5F8C
------- 翻译一下: -------
后	kSimplifiedVariant	后
後	kSimplifiedVariant	后
后	kTraditionalVariant	后 後

这种一对多、多对一的转换,除了「后/後」,还有「干/幹」等。

还有 kSpecializedSemanticVariant 这种「井/丼」的。

还有 kSpoofingVariant 这种欺骗性变体,比如「胶 U+80F6」和「㬵 U+3B35」不是同一个字。

参照 http://www.unicode.org/reports/tr38/#SCTC 查看各种标记的说明。

用不到这么精细的,不过这是个好工具啊,以后可能会用到。

自己弄个简体字表

适合简单的场景。

比如《通用汉字规范表》,但只有 8105 个字,并没有涵盖全部的简体字,比如「肏」「屄」「〇」「屌」「囧」等等很多字不在其中。

但《通用汉字规范表》缺失了大量生僻字,比如一大堆以鸟字旁、鱼字旁做为偏旁的汉字,不知道去哪里找到比较全面的字表。

opencc

如果不是太严谨的需求,临时使用的脚本等,可以考虑这个。

opencc 做简繁转换,然后对比原字符。

示例,判断字符是否为繁体字:

把字符进行繁转简。

c1 和繁转简后一致,则 c1 是简体字;

c2 和繁转简后不同,则 c2 是繁体字。

import opencc

converter = opencc.OpenCC('t2s.json')  # 繁体→简体

c1 = '门'
print(c1 == converter.convert(c1))  # '门' == '门' True

c2 = '門'
print(c2 == converter.convert(c2))  # '門' != '门' False

但并不完全成功:

import opencc

converter = opencc.OpenCC('t2s.json')  # 繁体→简体

for _, c in enumerate(['鴞', '鶲', '鮡', '鮠', '鮣', '鮋', '鮈', '鮊', '鰺', '鰏', '鰟']):
    print(c+' -> '+converter.convert(c))
    if c == converter.convert(c):
        print(c)
# 鴞 -> 鸮
# 鶲 -> 鹟
# 鮡 -> 鮡
# 鮡
# 鮠 -> 鮠
# 鮠
# 鮣 -> 䲟
# 鮋 -> 鲉
# 鮈 -> 鮈
# 鮈
# 鮊 -> 鲌
# 鰺 -> 鲹
# 鰏 -> 鲾
# 鰟 -> 鳑

试了一些超冷门的字,如「鮡 鮠 鮈」并没有被转换为「𬶐 𬶏 𬶋」。

另外还有一些问题,如「乾」会被识别为繁体字,转换为「干」。