きっかけ
以下のツイートで「埼玉埼⽟問題」と康煕部首を知りました。
「埼玉」と「埼⽟」の話。unicodedata.normalize('NFKC', '「埼玉」と「埼⽟」') でいけそう https://t.co/kte0sxDvZT
— Haruhiko Okumura (@h_okumura) July 11, 2020
康煕部首とは
⼀⼁⼂⼃⼄⼅⼆⼇⼈⼉⼊⼋⼌⼍⼎⼏⼐⼑⼒⼓⼔⼕⼖⼗⼘⼙⼚⼛⼜⼝⼞⼟⼠⼡⼢⼣⼤⼥⼦⼧⼨⼩⼪⼫⼬⼭⼮⼯⼰⼱⼲⼳⼴⼵⼶⼷⼸⼹⼺⼻⼼⼽⼾⼿⽀⽁⽂⽃⽄⽅⽆⽇⽈⽉⽊⽋⽌⽍⽎⽏⽐⽑⽒⽓⽔⽕⽖⽗⽘⽙⽚⽛⽜⽝⽞⽟⽠⽡⽢⽣⽤⽥⽦⽧⽨⽩⽪⽫⽬⽭⽮⽯⽰⽱⽲⽳⽴⽵⽶⽷⽸⽹⽺⽻⽼⽽⽾⽿⾀⾁⾂⾃⾄⾅⾆⾇⾈⾉⾊⾋⾌⾍⾎⾏⾐⾑⾒⾓⾔⾕⾖⾗⾘⾙⾚⾛⾜⾝⾞⾟⾠⾡⾢⾣⾤⾥⾦⾧⾨⾩⾪⾫⾬⾭⾮⾯⾰⾱⾲⾳⾴⾵⾶⾷⾸⾹⾺⾻⾼⾽⾾⾿⿀⿁⿂⿃⿄⿅⿆⿇⿈⿉⿊⿋⿌⿍⿎⿏⿐⿑⿒⿓⿔⿕
KangXi Radicals | UTF-8 Iconsより
上の「康煕部首(こうきぶしゅ: Kangxi Radicals)」は部首を表すための特殊な文字なので、通常の文字として使うものではありません。しかし上のリストの前半はいかにも部首らしい文字ですが、後半になると普通の漢字と同じに見えてしまいます。
このような文字が通常の文字に混じってしまうと、検索できるはずの文字が検索できなくなったりソート順が期待どおりにならなくなったりといった不具合の原因になるので、避ける必要があります。
参考: 康煕部首 - Wikipedia
康煕部首の検出
康煕部首はU+2F00〜U+2FDFという比較的狭い範囲に収まっています。せっかくなので、私のオレオレRailsアプリである日本語エラーチェックサイトenno.jpにも[\u2F00-\u2FDF]
の検出を追加しました。
これで、たとえば「埼玉埼⽟問題」という文字列をこのサイトでチェックすると康煕部首を検出できます。
CJK部首補助とは
先のツイートの続きでCJK部首補助を知りました。
まだ"黑"が抜けていて
最終的に都道府県、市町村名の変換は
str.maketrans("⻲⻑黑戶⻯⻄⻘⻤", "亀長黒戸竜西青鬼")
で変換できましたhttps://t.co/QaRs2regyp— 今治ニュース🤖 (@imabarinews) July 21, 2020
⺀⺁⺂⺃⺄⺅⺆⺇⺈⺉⺊⺋⺌⺍⺎⺏⺐⺑⺒⺓⺔⺕⺖⺗⺘⺙⺛⺜⺝⺞⺟⺠⺡⺢⺣⺤⺥⺦⺧⺨⺩⺪⺫⺬⺭⺮⺯⺰⺱⺲⺳⺴⺵⺶⺷⺸⺹⺺⺻⺼⺽⺾⺿⻀⻁⻂⻃⻄⻅⻆⻇⻈⻉⻊⻋⻌⻍⻎⻏⻐⻑⻒⻓⻔⻕⻖⻗⻘⻙⻚⻛⻜⻝⻞⻟⻠⻡⻢⻣⻤⻥⻦⻧⻨⻩⻪⻫⻬⻭⻮⻯⻰⻱⻲⻳
CJK Radicals Supplement | UTF-8 Iconsより
CJK部首補助(Radicals Supplement)も康煕部首と同様、通常の文字に混じってしまうと不具合の原因になります。
CJK部首補助の検出
CJK部首補助もU+2E80〜U+2EFFという比較的狭い範囲に収まっていますので、こちらも私のオレオレRailsアプリである日本語エラーチェックサイトenno.jpにも[\u2E80-\u2EFF]
の検出を追加しました。
おまけ: CJK統合漢字やCJK互換漢字にも部首はある
上述の康熙部首やCJK部首補助の文字は確実に部首なので、特殊な用途でない限り、原則として「通常の」日本語文からは一律に排除すべきと考えられます。
ただし、部首に相当する文字は康熙部首やCJK部首補助だけにあるわけではありません。部首に該当する文字は以下の「CJK統合漢字」や「CJK互換漢字」↓などにも含まれています。ややこしいですが、こちらの部首については通常の日本語文から一律に排除する必要はないだろうと推測しています。
参考: CJK統合漢字 (Unicodeのブロック) - Wikipedia
参考: CJK互換漢字 - Wikipedia
Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the United States and other countries.