Unicode/UTF-8用に漢字を部首ごとにインデックスしてみた


#ⵙⵓはじめに
ハードコア抽象文學者の__[kammultica](https://twitter.com/kammulticae)__です．
現在，人工言語を開発しております．中間生成物を上げていきます．

__使用言語：Python 3.6.5__
__最終目的：人工言語の運転__
※人工言語自体のコンセプトは[ブログ](https://spinaltox.hatenablog.jp/entry/2018/10/21/112623)，根本のコンセプトは[自サイト](https://spinaltox.net)参照のこと．

---


#ⵖⵓ部首空間の生成に向けた索引付け

CJK統合漢字はUnicodeの19986(4E00)～40943(9FEF)までを占めており，これは部首 (一～龠)の画数の少ない順に並んでいます[[参照](http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/cjku_klist.html)]．が，Unicode(16進数)から索引的にこれらを呼び出すことは不可能です．まずはこれの索引付けをおこないます．

以下の形式で部首のインデックスを構成します．形式はべつに何でも良いのですが，今後の発展性を見据えて，数値配列を辞書に格納しておきます．

>__辞書型__
>キー：__部首名__
>値　：__当該部首に属する漢字の全10進数値(配列)__


なお，pythonは変数名に英字以外の文字を指定することが可能であるため, 部首をそのまま索引名として用いています. 


できあがったものがコチラ．(pythonのrangeは(_a_, _b_)で_a_～_b_-1を指定する)

```py
# 1画
一 = list(range(19968, 20008))
丨 = list(range(20008, 20022))
丶 = list(range(20022, 20031))
丿 = list(range(20031, 20057))
乙 = list(range(20057, 20101)) # "乚"含む。
亅 = list(range(20101, 20108))

# 2画
二 = list(range(20108, 20128))
亠 = list(range(20128, 20154))
人 = list(range(20154, 20799)) # "亻"含む。
儿 = list(range(20799, 20837))
入 = list(range(20837, 20843))
八 = list(range(20843, 20866))
冂 = list(range(20866, 20886))
冖 = list(range(20886, 20907))
冫 = list(range(20907, 20960))
几 = list(range(20960, 20981)) # "⺇"含む。 
凵 = list(range(20981, 20992))
刀 = list(range(20992, 21147)) # "刂"含む。
力 = list(range(21147, 21241))
勹 = list(range(21241, 21269))
匕 = list(range(21269, 21274))
匚 = list(range(21274, 21304))
匸 = list(range(21304, 21313))
十 = list(range(21313, 21340))
卜 = list(range(21340, 21353))
卩 = list(range(21353, 21378)) #"㔾"含む。
厂 = list(range(21378, 21430))
厶 = list(range(21430, 21448))
又 = list(range(21448, 21475))

# 3画
口 = list(range(21475, 22231)) # kuchi
囗 = list(range(22231, 22303)) # kunigamae
土 = list(range(22303, 22763))
士 = list(range(22763, 22786))
夂 = list(range(22786, 22794))
夊 = list(range(22794, 22805))
夕 = list(range(22805, 22823))
大 = list(range(22823, 22899))
女 = list(range(22899, 23376))
子 = list(range(23376, 23424))
宀 = list(range(23424, 23544))
寸 = list(range(23544, 23567))
小 = list(range(23567, 23586))
尢 = list(range(23586, 23608))
尸 = list(range(23608, 23662))
屮 = list(range(23662, 23665))
山 = list(range(23665, 24027))
巛 = list(range(24027, 24037)) # "川"含む。
工 = list(range(24037, 24049))
己 = list(range(24049, 24062))
巾 = list(range(24062, 24178))
干 = list(range(24178, 24186))
幺 = list(range(24186, 24191))
广 = list(range(24191, 24308))
廴 = list(range(24308, 24318))
廾 = list(range(24318, 24331))
弋 = list(range(24331, 24339))
弓 = list(range(24339, 24400))
彐 = list(range(24400, 24417))
彡 = list(range(24417, 24435))
彳 = list(range(24435, 24515))
心 = list(range(24515, 25096))
戈 = list(range(25096, 25142))
戶 = list(range(25142, 25163))
手 = list(range(25163, 25903)) #"扌"含む。
支 = list(range(25903, 25908))
攴 = list(range(25908, 25991))
文 = list(range(25991, 26007))
斗 = list(range(26007, 26020))
斤 = list(range(26020, 26041))
方 = list(range(26041, 26080))
无 = list(range(26080, 26085))
日 = list(range(26085, 26352)) # hi
曰 = list(range(26352, 26376)) # ihaku
月 = list(range(26376, 26408))
木 = list(range(26408, 27424))
欠 = list(range(26424, 27490))
止 = list(range(27490, 27513))
歹 = list(range(27513, 27571))
殳 = list(range(27571, 27595))
毋 = list(range(27595, 27604))
比 = list(range(27604, 27611))
毛 = list(range(27611, 27663))
氏 = list(range(27663, 27668))
气 = list(range(27668, 27700))

# 4画
水 = list(range(27700, 28779)) # "氵"含む。
火 = list(range(28779, 29226))
爪 = list(range(29226, 29238))
父 = list(range(29238, 29243))
爻 = list(range(29243, 29247))
爿 = list(range(29243, 29255)) #"丬"含む。
片 = list(range(29255, 29273))
牙 = list(range(29273, 29275))
牛 = list(range(29275, 29356))
犬 = list(range(29356, 29572))

# 5画
玄 = list(range(29572, 29577))
玉 = list(range(29577, 29916)) #"𤣩"含む。
瓜 = list(range(29916, 29926))
瓦 = list(range(29926, 29976))
甘 = list(range(29976, 29983))
生 = list(range(29983, 29992))
用 = list(range(29992, 30000))
田 = list(range(30000, 30091))
疋 = list(range(30091, 30098))
疒 = list(range(30098, 30326))
癶 = list(range(30326, 30333))
白 = list(range(30333, 30382))
皮 = list(range(30382, 30399))
皿 = list(range(30339, 30446))
目 = list(range(30446, 30683))
矛 = list(range(30683, 30690))
矢 = list(range(30690, 30707))
石 = list(range(30707, 31034))
示 = list(range(31034, 31160))
禸 = list(range(31160, 31166))
禾 = list(range(31166, 31348))
穴 = list(range(31348, 31435))
立 = list(range(31435, 31481))

# 6画
竹 = list(range(31481, 31859))
米 = list(range(31859, 31992))
糸 = list(range(31992, 32566))
缶 = list(range(32566, 32593))
网 = list(range(32593, 32650)) #"罒"含む。
羊 = list(range(32650, 32701))
羽 = list(range(32701, 32769))
老 = list(range(32769, 32780))
而 = list(range(32780, 32786))
耒 = list(range(32786, 32819))
耳 = list(range(32819, 32895))
聿 = list(range(32895, 32905))
肉 = list(range(32905, 33251))
臣 = list(range(33251, 33258))
自 = list(range(33258, 33267))
至 = list(range(33267, 33276))
臼 = list(range(33276, 33292))
舌 = list(range(33292, 33307))
舛 = list(range(33307, 33311))
舟 = list(range(33311, 33390))
艮 = list(range(33390, 33394))
色 = list(range(33394, 33400))
艸 = list(range(33400, 34381))
虍 = list(range(34381, 34411))
虫 = list(range(34411, 34880))
血 = list(range(34880, 34892))
行 = list(range(34892, 34915))
衣 = list(range(34915, 35198))
襾 = list(range(35198, 35211)) #"西""覀"含む。

# 7画
見 = list(range(35211, 35282))
角 = list(range(35282, 35328))
言 = list(range(35328, 35895))
谷 = list(range(35895, 35910))
豆 = list(range(35910, 35925))
豕 = list(range(35925, 35960))
豸 = list(range(35960, 35997))
貝 = list(range(35997, 36196))
赤 = list(range(36196, 36208))
走 = list(range(36208, 36275))
足 = list(range(36275, 36523))
身 = list(range(36523, 36554))
車 = list(range(36554, 36763))
辛 = list(range(36763, 36784))
辰 = list(range(36784, 36789))
辵 = list(range(36789, 37009))
邑 = list(range(37009, 37193))
酉 = list(range(37193, 37318))
釆 = list(range(37318, 37324))
里 = list(range(37324, 37329))

# 8画
金 = list(range(37329, 38263))
長 = list(range(38263, 38272))
門 = list(range(38272, 38428))
阜 = list(range(38428, 38582))
隶 = list(range(38582, 38585))
隹 = list(range(38585, 38632))
雨 = list(range(38632, 38737))
靑 = list(range(38737, 38750))
非 = list(range(38750, 38754))

# 9画
面 = list(range(38754, 38761))
革 = list(range(38761, 38859))
韋 = list(range(38859, 38893))
韭 = list(range(38893, 38899))
音 = list(range(38899, 38913))
頁 = list(range(38913, 39080))
風 = list(range(39080, 39131))
飛 = list(range(39131, 39135))
食 = list(range(39135, 39318))
首 = list(range(39318, 39321))
香 = list(range(39321, 39340))

# 10画
馬 = list(range(39340, 39592))
骨 = list(range(39592, 39640))
高 = list(range(39640, 39647))
髟 = list(range(39647, 39717))
鬥 = list(range(39717, 39727))
鬯 = list(range(39727, 39730))
鬲 = list(range(39730, 39740))
鬼 = list(range(39740, 39770))

# 11画
魚 = list(range(39770, 40165))
鳥 = list(range(40165, 40565))
鹵 = list(range(40565, 40575))
鹿 = list(range(40575, 40613))
麥 = list(range(40613, 40635))
麻 = list(range(40635, 40643))
黃 = list(range(40643, 40653))

# 12画
黍 = list(range(40653, 40657))
黑 = list(range(40657, 40697))
黹 = list(range(40697, 40701))

# 13画
黽 = list(range(40701, 40718))
鼎 = list(range(40718, 40723))
鼓 = list(range(40723, 40736))
鼠 = list(range(40736, 40763))

# 14画
鼻 = list(range(40763, 40778))
齊 = list(range(40778, 40786))

# 15画
齒 = list(range(40786, 40845))

# 16画
龍 = list(range(40845, 40860))
龜 = list(range(40860, 40864))

# 16画
龠 = list(range(40864, 40870))

# その他 (最後尾に詰め込まれた模様)
他 = list(range(40870, 40944))
```

##ⵒⵓ蛇足
検証に用いたソースコードを以下に置いておきます．任意の10進数値を指定してfor文をまわすと対応する文字列を吐きます．
_(※冗長なのは他プロジェクトのコードを流用したため)_

```py
# -----------------------------------ソース--------------------------------------
def unicodation(self, number): # int を 16進数に変換 → utf-16 文字を1つ返す。
    unicodeCharacterHead = ""                                  # \u XX__ 16進数の文字数が足りないときに附加
    unicodeCharacterTail = str(hex(number)).replace("0x", "")  # \u __XX 入力した数(16進数)を文字列として抽出。repは仕様。
    if   len(unicodeCharacterTail) < 4: # \uXXXX 4つで正規。少ない時用
        for shortage in range(4 - len(unicodeCharacterTail)):
            unicodeCharacterHead += str(0)
    elif len(unicodeCharacterTail) > 4: # \uXXXX 多い時用
        unicodeCharacterTail = unicodeCharacterTail[:4]
    else:
        pass
        
     unicodeCharacter = "\\u" + unicodeCharacterHead + unicodeCharacterTail
     utfCharacter = bytes(unicodeCharacter, 'utf-8').decode('unicode-escape')
     return utfCharacter

# ---------------------------------以下検証用--------------------------------------
x = ""
for kimagure in range(200): # 表示させたい文字数
    x = x + unicodation(kimagure+40864) # 開始位置を+で。
print(x)
```


思いのほか時間を喰ったので今回の公開に至りました．コピペはご自由にどうぞ．
また，ミスがありましたらコメントにて教えてくださると嬉しいです．



#ⵟⵓ参考
* [漢字部首検索](http://rtk.art.coocan.jp/cjk/rads/index.html)
* [CJK統合漢字－全漢字一覧](http://www.asahi-net.or.jp/~ax2s-kmtn/ref/unicode/cjku_klist.html)