├── .gitignore
├── .gitmodules
├── LICENSE.txt
├── README-Hans.md
├── README-Hant.md
├── README.md
├── configure.py
├── merge.py
├── opencc_t2s.py
├── poster
├── heading.png
├── multilingual.png
└── poster.html
├── preview.png
├── round.py
├── set-encoding.py
└── source
├── noto
├── NotoSans-Bold.ttf
├── NotoSans-Condensed.ttf
├── NotoSans-CondensedBold.ttf
├── NotoSans-CondensedLight.ttf
├── NotoSans-CondensedMedium.ttf
├── NotoSans-Light.ttf
├── NotoSans-Medium.ttf
├── NotoSans-Regular.ttf
├── NotoSans-SemiCondensed.ttf
├── NotoSans-SemiCondensedBold.ttf
├── NotoSans-SemiCondensedLight.ttf
└── NotoSans-SemiCondensedMedium.ttf
└── rhr
└── placeholder
/.gitignore:
--------------------------------------------------------------------------------
1 | Makefile
2 | __pycache__/
3 | /source/rhr/*.ttf
4 | /build/
5 | /out/
6 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "libotd"]
2 | path = libotd
3 | url = https://github.com/nowar-fonts/libotd.git
4 |
--------------------------------------------------------------------------------
/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The font family is licensed under SIL OFL Version 1.1.
2 |
3 | 本系列字体以 SIL OFL 许可协议版本 1.1 授权。
4 |
5 | The fonts should not be sold by itself, or be redistributed without OFL. Modified version should not be redistributed with the reserved name “Nowar”, “有爱” or “有愛”.
6 |
7 | 本系列字体不得单独销售,不能以 OFL 以外的协议再发布。修改版的字体不能使用保留的名字 “Nowar”、“有爱”、“有愛”。
8 |
9 | -----------------------------------------------------------
10 |
11 | Copyright 2018—2019 Cyano Hao, with Reserved Font Name 'Nowar', '有爱' and '有愛'.
12 |
13 | Portions Copyright 2018 The Noto Project Authors (github.com/googlei18n/noto-fonts)
14 |
15 | Portions Copyright 2014, 2015, 2018 Adobe (http://www.adobe.com/), with
16 | Reserved Font Name 'Source'. Source is a trademark of Adobe in the
17 | United States and/or other countries.
18 |
19 | This Font Software is licensed under the SIL Open Font License,
20 | Version 1.1.
21 |
22 | This license is copied below, and is also available with a FAQ at:
23 | http://scripts.sil.org/OFL
24 |
25 | -----------------------------------------------------------
26 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
27 | -----------------------------------------------------------
28 |
29 | PREAMBLE
30 | The goals of the Open Font License (OFL) are to stimulate worldwide
31 | development of collaborative font projects, to support the font
32 | creation efforts of academic and linguistic communities, and to
33 | provide a free and open framework in which fonts may be shared and
34 | improved in partnership with others.
35 |
36 | The OFL allows the licensed fonts to be used, studied, modified and
37 | redistributed freely as long as they are not sold by themselves. The
38 | fonts, including any derivative works, can be bundled, embedded,
39 | redistributed and/or sold with any software provided that any reserved
40 | names are not used by derivative works. The fonts and derivatives,
41 | however, cannot be released under any other type of license. The
42 | requirement for fonts to remain under this license does not apply to
43 | any document created using the fonts or their derivatives.
44 |
45 | DEFINITIONS
46 | "Font Software" refers to the set of files released by the Copyright
47 | Holder(s) under this license and clearly marked as such. This may
48 | include source files, build scripts and documentation.
49 |
50 | "Reserved Font Name" refers to any names specified as such after the
51 | copyright statement(s).
52 |
53 | "Original Version" refers to the collection of Font Software
54 | components as distributed by the Copyright Holder(s).
55 |
56 | "Modified Version" refers to any derivative made by adding to,
57 | deleting, or substituting -- in part or in whole -- any of the
58 | components of the Original Version, by changing formats or by porting
59 | the Font Software to a new environment.
60 |
61 | "Author" refers to any designer, engineer, programmer, technical
62 | writer or other person who contributed to the Font Software.
63 |
64 | PERMISSION & CONDITIONS
65 | Permission is hereby granted, free of charge, to any person obtaining
66 | a copy of the Font Software, to use, study, copy, merge, embed,
67 | modify, redistribute, and sell modified and unmodified copies of the
68 | Font Software, subject to the following conditions:
69 |
70 | 1) Neither the Font Software nor any of its individual components, in
71 | Original or Modified Versions, may be sold by itself.
72 |
73 | 2) Original or Modified Versions of the Font Software may be bundled,
74 | redistributed and/or sold with any software, provided that each copy
75 | contains the above copyright notice and this license. These can be
76 | included either as stand-alone text files, human-readable headers or
77 | in the appropriate machine-readable metadata fields within text or
78 | binary files as long as those fields can be easily viewed by the user.
79 |
80 | 3) No Modified Version of the Font Software may use the Reserved Font
81 | Name(s) unless explicit written permission is granted by the
82 | corresponding Copyright Holder. This restriction only applies to the
83 | primary font name as presented to the users.
84 |
85 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
86 | Software shall not be used to promote, endorse or advertise any
87 | Modified Version, except to acknowledge the contribution(s) of the
88 | Copyright Holder(s) and the Author(s) or with their explicit written
89 | permission.
90 |
91 | 5) The Font Software, modified or unmodified, in part or in whole,
92 | must be distributed entirely under this license, and must not be
93 | distributed under any other license. The requirement for fonts to
94 | remain under this license does not apply to any document created using
95 | the Font Software.
96 |
97 | TERMINATION
98 | This license becomes null and void if any of the above conditions are
99 | not met.
100 |
101 | DISCLAIMER
102 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
103 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
104 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
105 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
106 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
107 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
108 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
109 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
110 | OTHER DEALINGS IN THE FONT SOFTWARE.
111 |
--------------------------------------------------------------------------------
/README-Hans.md:
--------------------------------------------------------------------------------
1 | [English](README.md) **简体中文** [繁體中文](README-Hant.md)
2 |
3 | # 有爱圆体
4 |
5 | 有爱圆体是《魔兽世界》和《魔兽世界:经典怀旧服》字体包,支持所有语言。有爱圆体是 [Noto Sans](https://github.com/googlei18n/noto-fonts) 和 [Resource Han Rounded](https://github.com/CyanoHao/Resource-Han-Rounded) 的合并字体。
6 |
7 | > Make Love, Not Warcraft.
8 | > 要有爱,不要魔兽争霸。
9 | > 要愛,不要魔獸。
10 |
11 | 
12 |
13 | 
14 |
15 | ## 下载指南
16 |
17 | [GitHub 上的最新版](https://github.com/nowar-fonts/Nowar-Rounded/releases)
18 |
19 | 镜像:[Gitee](https://gitee.com/nowar-fonts/Nowar-Rounded)
20 |
21 | 有爱圆体有 4 种字重和 5 种地区变体,此外还有若干特性。
22 |
23 | ### 字重
24 |
25 | * 300:细体
26 | * 400:常规
27 | * 500:中等
28 | * 700:粗体
29 |
30 | ### 地区变体
31 |
32 | Bliz 和 Neut 是 “标准变体”,遵循各地区的字形标准。
33 |
34 | | | 西文和韩国语 | 简体中文 | 繁體中文 | 备注 |
35 | | ---- | ----------------- | ------------ | -------- | ------------------------------- |
36 | | Bliz | 中国大陆字形(UI)| 中国大陆字形 | 台湾字形 | 遵从《魔兽世界》默认字体设置。 |
37 | | Neut | 传统字形(UI) | 中国大陆字形 | 台湾字形 | 未指定字形标准时,采用传统字形。|
38 |
39 | CL 是 “传统变体”,采用传统印刷字形(即康熙字形)。
40 |
41 | | | 西文和韩国语 | 中文 |
42 | | -- | ------------- | -------- |
43 | | CL | 传统字形(UI)| 传统字形 |
44 |
45 | PSimp、PSimpChat 是针对繁体中文的变体,把繁体字重映射为简化字字形。
46 |
47 | | | 通用字体 | 繁体中文文本、战斗、工具提示字体 | 繁体中文聊天字体 | 西文、简体中文、韩国语 |
48 | | --------- | --------------------------| --------------------- | --------------------- | ------ |
49 | | PSimp | 中国大陆字形(UI,重映射)| 中国大陆字形(重映射)| 中国大陆字形 | 不可用 |
50 | | PSimpChat | 中国大陆字形(UI,重映射)| 中国大陆字形(重映射)| 中国大陆字形(重映射)| 不可用 |
51 |
52 | * 西文:英语、西班牙语(拉丁美洲)、葡萄牙语、德语、西班牙语(欧洲)、法语、意大利语、俄语。
53 | * UI:中西文共用的标点视作西文标点;半角 CJK 标点。
54 | * 通用字体:`FRIZQT__` 和 `ARIALN`。某些插件硬编码了此字体。
55 |
56 | ### 特性
57 |
58 | | 标记 | 名称 | 简介 |
59 | | ---- | ----------- | ------------------------------------------------- |
60 | | OSF | Oldstyle | 不齐线、不等宽的旧式数字。 |
61 | | SC | Smallcaps | 小型大写拉丁字母。 |
62 | | RP | Roleplaying | `丶`(U+4E36)重映射为 `·`(U+00B7,MIDDLE DOT)。|
63 |
64 | 预编译的特性变体:`Bliz,OSF`、`Bliz,RP`、`Bliz,SC`。
65 |
--------------------------------------------------------------------------------
/README-Hant.md:
--------------------------------------------------------------------------------
1 | [English](README.md) [简体中文](README-Hans.md) **繁體中文**
2 |
3 | # 有愛圓體
4 |
5 | 有愛圓體是《魔獸世界》和《魔獸世界:經典版》字型包,支援所有語言。有愛圓體是 [Noto Sans](https://github.com/googlei18n/noto-fonts) 和 [Resource Han Rounded](https://github.com/CyanoHao/Resource-Han-Rounded) 的合併字型。
6 |
7 | > Make Love, Not Warcraft.
8 | > 要有爱,不要魔兽争霸。
9 | > 要愛,不要魔獸。
10 |
11 | 
12 |
13 | 
14 |
15 | ## 下載向導
16 |
17 | [GitHub 上的最新發佈](https://github.com/nowar-fonts/Nowar-Rounded/releases)
18 |
19 | 鏡像:[Gitee](https://gitee.com/nowar-fonts/Nowar-Rounded)
20 |
21 | 有愛圓體有 4 種字重和 5 種地區變體,此外還有若干特徵。
22 |
23 | ### 字重
24 |
25 | * 300:細體
26 | * 400:常規
27 | * 500:中等
28 | * 700:粗體
29 |
30 | ### 地區變體
31 |
32 | Bliz 和 Neut 是「標準變體」,遵循各地區的字形標準。
33 |
34 | | | 西文和韓國語 | 簡體中文 | 繁體中文 | 備注 |
35 | | ---- | ----------------- | ------------ | -------- | ------------------------------- |
36 | | Bliz | 中國大陸字形(UI)| 中國大陸字形 | 臺灣字形 | 遵從《魔獸世界》預設字型設定。 |
37 | | Neut | 傳統字形(UI) | 中國大陸字形 | 臺灣字形 | 未指定字形標準時,採用傳統字形。|
38 |
39 | CL 是「傳統變體」,採用傳統印刷字形(即康熙字形)。
40 |
41 | | | 西文和韓國語 | 中文 |
42 | | -- | ------------- | -------- |
43 | | CL | 傳統字形(UI)| 傳統字形 |
44 |
45 | PSimp、PSimpChat 是針對繁體中文的變體,把繁體字重對映為簡化字字形。
46 |
47 | | | 通用字型 | 繁體中文文本、戰鬥、提示訊息字型 | 繁體中文聊天字型 | 西文、簡體中文、韓國語 |
48 | | --------- | --------------------------| --------------------- | --------------------- | ------ |
49 | | PSimp | 中國大陸字形(UI,重對映)| 中國大陸字形(重對映)| 中國大陸字形 | 不適用 |
50 | | PSimpChat | 中國大陸字形(UI,重對映)| 中國大陸字形(重對映)| 中國大陸字形(重對映)| 不適用 |
51 |
52 | * 西文:英語、西班牙語(拉丁美洲)、葡萄牙語、德語、西班牙語(歐洲)、法語、義大利語、俄語。
53 | * UI:中西文共用的標點視作西文標點;半形 CJK 標點。
54 | * 通用字型:`FRIZQT__` 和 `ARIALN`。某些插件硬編碼了此字型。
55 |
56 | ### 特徵
57 |
58 | | 標記 | 名稱 | 簡介 |
59 | | ---- | ----------- | ------------------------------------------------------------------------------- |
60 | | OSF | Oldstyle | 不齊線、不等寬的舊樣式數字。 |
61 | | SC | Smallcaps | 小型大寫拉丁字母。 |
62 | | RP | Roleplaying | `丶`(U+4E36)重對映為 `·`(U+00B7,MIDDLE DOT;或 U+2027,HYPHENATION POINT)。|
63 |
64 | 預編譯的特徵變體:`Bliz,OSF`、`Bliz,RP`、`Bliz,SC`。
65 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | **English** [简体中文](README-Hans.md) [繁體中文](README-Hant.md)
2 |
3 | # Nowar Rounded
4 |
5 | This is Nowar Rounded, font packs for _World of Warcraft_ and _WoW Classic_ that support all client languages. Nowar Rounded is based on [Noto Sans](https://github.com/googlei18n/noto-fonts) and [Resource Han Rounded](https://github.com/CyanoHao/Resource-Han-Rounded).
6 |
7 | > Make Love, Not Warcraft.
8 | > 要有爱,不要魔兽争霸。
9 | > 要愛,不要魔獸。
10 |
11 | 
12 |
13 | 
14 |
15 | ## Download the Fonts
16 |
17 | [Latest release at GitHub](https://github.com/nowar-fonts/Nowar-Rounded/releases)
18 |
19 | Mirrors: [Gitee (release repo)](https://gitee.com/nowar-fonts/Nowar-Rounded)
20 |
21 | Nowar Rounded is shipped in 4 weights and 5 regional variants, with several features.
22 |
23 | ### Regional Variants
24 |
25 | Bliz and Neut are “standard variants” with regional Chinese character orthographies.
26 |
27 | | | European and 한국어 | 简体中文 | 繁體中文 | Note |
28 | | ---- | ------------------- | -------------- | -------- | ------------------------------------------ |
29 | | Bliz | Mainland China (UI) | Mainland China | Taiwan | Acts like WoW’s default fallback setting. |
30 | | Neut | Classical (UI) | Mainland China | Taiwan | Prefers classical orthography on fallback. |
31 |
32 | CL is the “classical variant” with classical Chinese character orthography (aka Kāngxī Dictionary forms).
33 |
34 | | | European and 한국어 | 中文 |
35 | | -- | ------------------- | --------- |
36 | | CL | Classical (UI) | Classical |
37 |
38 | PSimp and PSimpChat are special variants for 繁體中文 that remap traditional Chinese character to simplified ones.
39 |
40 | | | Common Fonts | 繁體中文 Text, Combat and Tooltip Fonts | 繁體中文 Chat Fonts | European, 简体中文 and 한국어 |
41 | | --------- | ----------------------------- | ------------------------- | ------------------------- | --- |
42 | | PSimp | Mainland China (UI, Remapped) | Mainland China (Remapped) | Mainland China | N/A |
43 | | PSimpChat | Mainland China (UI, Remapped) | Mainland China (Remapped) | Mainland China (Remapped) | N/A |
44 |
45 | * European: English, Español (AL), Português, Deutsch, Español (EU), Français, Italiano, and Русский.
46 | * UI: Ambiguous punctations are treated as Western; CJK puctations are half-width.
47 | * Common fonts: `FRIZQT__` and `ARIALN`, which are hard-coded in some addons.
48 |
49 | ### Features
50 |
51 | | Tag | Name | Description |
52 | | --- | ----------- | ---------------------------------------------------------------------- |
53 | | OSF | Oldstyle | Oldstyle (non-lining), propotional figure. |
54 | | RP | Roleplaying | `丶` (U+4E36) is mapped to the same glyph as `·` (U+00B7, MIDDLE DOT). |
55 | | SC | Smallcaps | Small capitals for Latin. |
56 |
57 | Pre-built feature variants: `Bliz,OSF`, `Bliz,RP`, `Bliz,SC`.
58 |
59 | ## How to Build
60 |
61 | ### Dependencies
62 |
63 | + basic Unix utils,
64 | + [Python](https://www.python.org/),
65 | + [otfcc](https://github.com/caryll/otfcc) and
66 | + [7-Zip](https://www.7-zip.org/) (add to `PATH`).
67 |
68 | Note:
69 | + Choose 64-bit version if possible. 32-bit version may lead to out-of-memory issue.
70 |
71 | ### Build Feature Variant
72 |
73 | Prepare submodules:
74 | ```bash
75 | git submodule update --init --recursive
76 | ```
77 |
78 | Run `configure.py` to generate Makefile:
79 | ```bash
80 | python configure.py
81 | ```
82 |
83 | Put Resource Han Rounded TTF files to `source/rhr/`.
84 |
85 | Then make a specific variant:
86 | ```bash
87 | make ,- -j
88 | ```
89 | Note: Features must be sorted alphabetically. (`OSF`, `RP`, `SC`).
90 |
91 | e.g.
92 | ```bash
93 | make CN,OSF,RP-400 -j4
94 | ```
95 |
96 | The output is `out/NowarSans-,--.7z`.
97 |
98 | ### Create Regional Variant
99 |
100 | To build exactly what you need, modify `configure.py`:
101 | ```python
102 | class Config:
103 | # put your variant here
104 | fontPackRegion = [ ]
105 |
106 | # define the variant here.
107 | regionalVariant = { ... }
108 | ```
109 |
110 | For example, the “CNmulti” multi-orthography variant,
111 |
112 | | | European | 简体中文 | 繁體中文 | 한국어 |
113 | | ------- | ------------------- | -------------- | -------- | ------------- |
114 | | CNmulti | Mainland China (UI) | Mainland China | Taiwan | S. Korea (UI) |
115 |
116 | ```python
117 | class Config:
118 | fontPackRegion = [ "CNmulti" ]
119 |
120 | regionalVariant = {
121 | "CNmulti": {
122 | "base": "CN",
123 | "enUS": True,
124 | "ruRU": True,
125 | "zhCN": "CN",
126 | "zhTW": "TW",
127 | "koKR": "KR",
128 | }
129 | }
130 | ```
131 |
132 | Then, run `python configure.py` to generate `Makefile`. The new regional variant (with optional feature) can be built by:
133 | ```bash
134 | make ,- -j
135 | ```
136 | e.g.
137 | ```bash
138 | make CNmulti-400 -j4
139 | make CNmulti,OSF-400 -j4
140 | ```
141 |
142 | ## Credit
143 |
144 | Latin, Greek and Cyrillic characters are from [Noto Sans](https://github.com/googlei18n/noto-fonts) by Google.
145 |
146 | CJK Ideographs, Kana and Hangul are from [Resource Han Rounded](https://github.com/CyanoHao/Resource-Han-Rounded), which is derived from [Source Han Sans](https://github.com/adobe-fonts/source-han-sans) by Adobe.
147 |
--------------------------------------------------------------------------------
/configure.py:
--------------------------------------------------------------------------------
1 | import json
2 | import codecs
3 | import enum
4 | import hashlib
5 | from functools import reduce
6 | from itertools import product
7 |
8 |
9 | class Config:
10 | version = "0.3.0"
11 | fontRevision = 0.0300
12 | vendor = "Nowar Typeface"
13 | vendorId = "NOWR"
14 | vendorUrl = "https://github.com/nowar-fonts"
15 | copyright = "Copyright © 2018—2020 Cyano Hao and Nowar Typeface, with Reserved Font Name “Nowar”, “Новар”, “Νοωαρ”, “有爱”, and “有愛”. Portions Copyright 2011 Google Inc. Portions © 2014-2019 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'."
16 | designer = "Cyano Hao (round all glyphs, character set definition & modification for World of Warcraft); Monotype Design Team (Latin, Greek & Cyrillic); Ryoko NISHIZUKA 西塚涼子 (kana, bopomofo & ideographs); Sandoll Communications 산돌커뮤니케이션, Soo-young JANG 장수영 & Joo-yeon KANG 강주연 (hangul elements, letters & syllables); Dr. Ken Lunde (project architect, glyph set definition & overall production); Masataka HATTORI 服部正貴 (production & ideograph elements)"
17 | designerUrl = "https://github.com/CyanoHao"
18 | license = "This Font Software is licensed under the SIL Open Font License, Version 1.1. This Font Software is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software."
19 | licenseUrl = "https://scripts.sil.org/OFL"
20 |
21 | fontPackWeight = [300, 400, 500, 700]
22 | fontPackRegion = ["Bliz", "Neut", "CL", "PSimp", "PSimpChat"]
23 | fontPackFeature = ["OSF", "RP", "SC"]
24 | # feature tags must be sorted alphabetically
25 | fontPackExportFeature = [
26 | ("Bliz", ["OSF"]),
27 | ("Bliz", ["RP"]),
28 | ("Bliz", ["SC"]),
29 | ]
30 |
31 |
32 | config = Config()
33 |
34 |
35 | # define Chinese characters orthographies, and feature mods:
36 | #
37 | # base - common fonts, `FRIZQT__` and `ARIALN`; must be defined
38 | # enUS - fonts for languages in Latin script, `skurri` and `MORPHEUS`
39 | # if set to something to be true, the orthography is considered to be same as `base`
40 | # if set to something to be false, fonts will be not overwritten
41 | # ruRU - fonts for Русский; like `enUS`
42 | # zhCN - fonts for 简体中文; can be false
43 | # zhTW - fonts for 繁體中文; can be false
44 | # koKR - fonts for 한국어; can be false
45 | #
46 | # xmod - a list of tuples of feature mod and related parameter list
47 | # available mods:
48 | # PSimp - 伪简体, remap traditional Chinese characters to simplified ones in zhTW text, damage, and note font
49 | # base - also do remapping in common fonts (`FRIZQT__` and `ARIALN`)
50 | # chat - also do remapping in zhTW chat fonts (`arheiuhk_bd` for Battle and `bHEI01B` for Classic)
51 | regionalVariant = {
52 | "Neut": {
53 | "base": "CL",
54 | "enUS": True,
55 | "ruRU": True,
56 | "zhCN": "CN",
57 | "zhTW": "TW",
58 | "koKR": "CL",
59 | },
60 | "Bliz": {
61 | "base": "CN",
62 | "enUS": True,
63 | "ruRU": True,
64 | "zhCN": "CN",
65 | "zhTW": "TW",
66 | "koKR": "CN", # yes, it is
67 | },
68 | "CL": {
69 | "base": "CL",
70 | "enUS": True,
71 | "ruRU": True,
72 | "zhCN": "CL",
73 | "zhTW": "CL",
74 | "koKR": "CL",
75 | },
76 | "PSimp": {
77 | "base": "CN",
78 | "enUS": None,
79 | "ruRU": None,
80 | "zhCN": None,
81 | "zhTW": "CN",
82 | "koKR": None,
83 | "xmod": [("PSimp", ["base"])],
84 | },
85 | "PSimpChat": {
86 | "base": "CN",
87 | "enUS": None,
88 | "ruRU": None,
89 | "zhCN": None,
90 | "zhTW": "CN",
91 | "koKR": None,
92 | "xmod": [("PSimp", ["base", "chat"])],
93 | },
94 | "CN": { # deprecated
95 | "base": "CN",
96 | "enUS": True,
97 | "ruRU": True,
98 | "zhCN": "CN",
99 | "zhTW": "TW",
100 | "koKR": "KR",
101 | },
102 | "TW": { # deprecated
103 | "base": "TW",
104 | "enUS": True,
105 | "ruRU": True,
106 | "zhCN": "CN",
107 | "zhTW": "TW",
108 | "koKR": "KR",
109 | },
110 | "HK": { # deprecated
111 | "base": "HK",
112 | "enUS": True,
113 | "ruRU": True,
114 | "zhCN": "CN",
115 | "zhTW": "HK",
116 | "koKR": "KR",
117 | },
118 | "JP": { # deprecated
119 | "base": "JP",
120 | "enUS": True,
121 | "ruRU": True,
122 | "zhCN": "CN",
123 | "zhTW": "TW",
124 | "koKR": "KR",
125 | },
126 | }
127 |
128 |
129 | class LanguageId(enum.IntEnum):
130 | enGB = 0x0809
131 | enUS = 0x0409
132 | jaJP = 0x0411
133 | koKR = 0x0412
134 | zhCN = 0x0804
135 | zhHK = 0x0C04
136 | zhMO = 0x1404
137 | zhSG = 0x1004
138 | zhTW = 0x0404
139 |
140 |
141 | weightMap = {
142 | 100: "Thin",
143 | 200: "ExtraLight",
144 | 300: "Light",
145 | 372: "Normal",
146 | 400: "",
147 | 500: "Medium",
148 | 600: "SemiBold",
149 | 700: "Bold",
150 | 800: "ExtraBold",
151 | 900: "Black",
152 | }
153 |
154 | weightMapShort = {
155 | 100: "Th",
156 | 200: "XLt",
157 | 300: "Lt",
158 | 372: "Nm",
159 | 400: "",
160 | 500: "Md",
161 | 600: "SmBd",
162 | 700: "Bd",
163 | 800: "XBd",
164 | 900: "Bk",
165 | }
166 |
167 | widthMap = {
168 | 3: "Condensed",
169 | 4: "SemiCondensed",
170 | 5: None,
171 | 7: "Extended",
172 | 10: "Warcraft", # Warcraft numeral hack
173 | }
174 |
175 | widthMapShort = {
176 | 3: "Cn",
177 | 4: "SmCn",
178 | 5: None,
179 | 7: "Ex",
180 | 10: "Wc",
181 | }
182 |
183 | slantMapShort = {
184 | "Italic": "It",
185 | "Oblique": "Obl",
186 | }
187 |
188 | notoWidthMap = {
189 | 3: 3,
190 | 5: 4,
191 | 7: 5,
192 | }
193 |
194 | # map orthography to source file
195 | shsRegionMap = {
196 | "CN": "ResourceHanRoundedSC",
197 | "TW": "ResourceHanRoundedTC",
198 | "HK": "ResourceHanRoundedHC",
199 | "MO": "ResourceHanRoundedMC",
200 | "JP": "ResourceHanRoundedJ", # there is an extra “J”
201 | "KR": "ResourceHanRoundedK",
202 | "CL": "ResourceHanRoundedK",
203 | }
204 |
205 | regionNameMap = {
206 | "CN": "CN",
207 | "TW": "TW",
208 | "HK": "HK",
209 | "MO": "MO",
210 | "JP": "JP",
211 | "KR": "KR",
212 | "CL": "Classical",
213 | # Nowar Rounded has never supported “GB” (GB18030)
214 | }
215 |
216 | # sorted alphabetically
217 | featureNameMap = {
218 | "OSF": "Oldstyle",
219 | "RP": "Roleplaying",
220 | "SC": "Smallcaps",
221 | "Simp": "Simplified",
222 | "UI": "UI",
223 | }
224 |
225 | tagNameMap = {**regionNameMap, **featureNameMap}
226 |
227 |
228 | def LocalizedFamily(p):
229 | return {
230 | LanguageId.enUS: "Nowar Rounded",
231 | LanguageId.enGB: "Nowar Rounded",
232 |
233 | LanguageId.jaJP: "有愛丸ゴシック",
234 | LanguageId.koKR: "有愛 굴림",
235 | LanguageId.zhCN: "有爱圆体",
236 | LanguageId.zhHK: "有愛圓體",
237 | LanguageId.zhMO: "有愛圓體",
238 | LanguageId.zhSG: "有爱圆体",
239 | LanguageId.zhTW: "有愛圓體",
240 | }
241 |
242 |
243 | def TagListToStr(lst):
244 | return ",".join(lst)
245 |
246 |
247 | def GenerateFontName(p):
248 | localizedFamily = LocalizedFamily(p)
249 | region = p["region"]
250 | feature = [*sorted(p["feature"])]
251 |
252 | regionName = regionNameMap[region]
253 | subfamily = [tagNameMap[fea] for fea in feature]
254 | filenameSf = []
255 | wwsF = [region, *feature]
256 | wwsSf = []
257 | legacyF = [region, *feature]
258 | legacySf = []
259 |
260 | width = p["width"]
261 | widthName = widthMap[width]
262 | widthShort = widthMapShort[width]
263 | if widthName:
264 | subfamily.append(widthName)
265 | filenameSf.append(widthName)
266 | legacyF.append(widthShort)
267 | # Warcraft numeral hack
268 | if width == 10:
269 | wwsF.append(widthShort)
270 | elif widthName:
271 | wwsSf.append(widthName)
272 |
273 | weight = p["weight"]
274 | weightName = weightMap[weight]
275 | weightShort = weightMapShort[weight]
276 | if weightName:
277 | subfamily.append(weightName)
278 | filenameSf.append(weightName)
279 | wwsSf.append(weightName)
280 | if weight == 700:
281 | legacySf.append(weightName)
282 | else:
283 | legacyF.append(weightShort)
284 |
285 | if p.get("slant"):
286 | slantName = p["slant"]
287 | slantShort = slantMapShort[slantName]
288 | subfamily.append(slantName)
289 | filenameSf.append(slantName)
290 | wwsSf.append(slantName)
291 | if slantName == "Italic":
292 | legacySf.append(slantName)
293 | else:
294 | legacyF.append(slantShort)
295 |
296 | def formatFamily(f):
297 | return " ".join(f)
298 |
299 | def formatSubfamily(sf):
300 | return " ".join(sf) or "Regular"
301 |
302 | subfamily = formatSubfamily(subfamily)
303 | filenameF = localizedFamily[LanguageId.enUS].replace(" ", "")
304 | filenameTag = TagListToStr([p["region"], *sorted(p["feature"])])
305 | filenameSf = formatSubfamily(filenameSf).replace(" ", "")
306 | wwsF = formatFamily(wwsF)
307 | wwsSf = formatSubfamily(wwsSf)
308 | legacyF = formatSubfamily(legacyF)
309 | legacySf = formatSubfamily(legacySf)
310 |
311 | return {
312 | "typographic": ({k: "{} {}".format(v, regionName) for k, v in localizedFamily.items()}, subfamily),
313 | "wws": ({k: "{} {}".format(v, wwsF) for k, v in localizedFamily.items()}, wwsSf),
314 | "legacy": ({k: "{} {}".format(v, legacyF) for k, v in localizedFamily.items()}, legacySf),
315 | "friendly": {k: "{} {} {}".format(v, regionName, subfamily) for k, v in localizedFamily.items()},
316 | "file": "{}-{}-{}".format(filenameF, filenameTag, filenameSf),
317 | # font name can be too long to fit in 63-char PostScript name
318 | # the hashed name makes no sence but is valid
319 | "postscript": filenameF + "-" + hashlib.sha1("{} {}".format(regionName, subfamily).encode()).hexdigest(),
320 | }
321 |
322 |
323 | def GenerateFilename(p):
324 | if p["family"] == "Nowar":
325 | filename = GenerateFontName(p)["file"]
326 | return p["encoding"] + "-" + filename
327 | else:
328 | nameList = {
329 | "Noto": lambda p: "NotoSans",
330 | "SHS": lambda p: p["region"],
331 | }
332 | family = nameList[p["family"]](p)
333 | subfamily = ((widthMap[p["width"]] or "") + (weightMap[p["weight"]] or "") +
334 | (p.get("slant") or "")) or "Regular"
335 | return family + "-" + subfamily
336 |
337 |
338 | def ResolveDependency(p):
339 | if p["width"] == 10: # Warcraft numeral hack
340 | result = {
341 | "Latin": {
342 | "family": "Noto",
343 | "width": 4,
344 | "weight": p["weight"],
345 | },
346 | "Numeral": {
347 | "family": "Noto",
348 | "width": 3,
349 | "weight": p["weight"],
350 | },
351 | }
352 | else:
353 | result = {
354 | "Latin": {
355 | "family": "Noto",
356 | "width": notoWidthMap[p["width"]],
357 | "weight": p["weight"],
358 | },
359 | }
360 | result["CJK"] = {
361 | "family": "SHS",
362 | "weight": p["weight"],
363 | "width": 5,
364 | "region": shsRegionMap[p["region"]],
365 | }
366 | return result
367 |
368 |
369 | def GetCommonFont(weight, region, feature):
370 | xfea = []
371 | for mod, params in regionalVariant[region].get("xmod", []):
372 | if mod == "PSimp" and "base" in params:
373 | xfea.append("Simp")
374 | return {
375 | "weight": weight,
376 | "width": 7,
377 | "family": "Nowar",
378 | "region": regionalVariant[region]["base"],
379 | "feature": ["UI"] + feature + xfea,
380 | "encoding": "unspec",
381 | }
382 |
383 |
384 | def GetCommonChatFont(weight, region, feature):
385 | xfea = []
386 | for mod, params in regionalVariant[region].get("xmod", []):
387 | if mod == "PSimp" and "base" in params:
388 | xfea.append("Simp")
389 | return {
390 | "weight": weight,
391 | "width": 3,
392 | "family": "Nowar",
393 | "region": regionalVariant[region]["base"],
394 | "feature": ["UI"] + feature + xfea,
395 | "encoding": "unspec",
396 | }
397 |
398 |
399 | def GetLatinFont(weight, region, feature):
400 | return {
401 | "weight": weight,
402 | "width": 7,
403 | "family": "Nowar",
404 | "region": regionalVariant[region]["base"],
405 | "feature": ["UI"] + feature,
406 | "encoding": "unspec",
407 | }
408 |
409 |
410 | def GetLatinChatFont(weight, region, feature):
411 | return {
412 | "weight": weight,
413 | "width": 3,
414 | "family": "Nowar",
415 | "region": regionalVariant[region]["base"],
416 | "feature": ["UI"] + feature,
417 | "encoding": "unspec",
418 | }
419 |
420 |
421 | def GetHansFont(weight, region, feature):
422 | return {
423 | "weight": weight,
424 | "width": 10,
425 | "family": "Nowar",
426 | "region": regionalVariant[region]["zhCN"],
427 | "feature": feature,
428 | "encoding": "gbk",
429 | }
430 |
431 |
432 | def GetHansCombatFont(weight, region, feature):
433 | return {
434 | "weight": weight,
435 | "width": 7,
436 | "family": "Nowar",
437 | "region": regionalVariant[region]["zhCN"],
438 | "feature": feature,
439 | "encoding": "gbk",
440 | }
441 |
442 |
443 | def GetHansChatFont(weight, region, feature):
444 | return {
445 | "weight": weight,
446 | "width": 3,
447 | "family": "Nowar",
448 | "region": regionalVariant[region]["zhCN"],
449 | "feature": feature,
450 | "encoding": "gbk",
451 | }
452 |
453 |
454 | def GetHantFont(weight, region, feature):
455 | xfea = []
456 | for mod, _ in regionalVariant[region].get("xmod", []):
457 | if mod == "PSimp":
458 | xfea.append("Simp")
459 | return {
460 | "weight": weight,
461 | "width": 10,
462 | "family": "Nowar",
463 | "region": regionalVariant[region]["zhTW"],
464 | "feature": feature + xfea,
465 | "encoding": "big5",
466 | }
467 |
468 |
469 | def GetHantCombatFont(weight, region, feature):
470 | xfea = []
471 | for mod, _ in regionalVariant[region].get("xmod", []):
472 | if mod == "PSimp":
473 | xfea.append("Simp")
474 | return {
475 | "weight": weight,
476 | "width": 7,
477 | "family": "Nowar",
478 | "region": regionalVariant[region]["zhTW"],
479 | "feature": feature + xfea,
480 | "encoding": "big5",
481 | }
482 |
483 |
484 | def GetHantNoteFont(weight, region, feature):
485 | xfea = []
486 | for mod, _ in regionalVariant[region].get("xmod", []):
487 | if mod == "PSimp":
488 | xfea.append("Simp")
489 | return {
490 | "weight": weight,
491 | "width": 5,
492 | "family": "Nowar",
493 | "region": regionalVariant[region]["zhTW"],
494 | "feature": feature + xfea,
495 | "encoding": "big5",
496 | }
497 |
498 |
499 | def GetHantChatFont(weight, region, feature):
500 | xfea = []
501 | for mod, params in regionalVariant[region].get("xmod", []):
502 | if mod == "PSimp" and "chat" in params:
503 | xfea.append("Simp")
504 | return {
505 | "weight": weight,
506 | "width": 3,
507 | "family": "Nowar",
508 | "region": regionalVariant[region]["zhTW"],
509 | "feature": feature + xfea,
510 | "encoding": "big5",
511 | }
512 |
513 |
514 | def GetKoreanFont(weight, region, feature):
515 | return {
516 | "weight": weight,
517 | "width": 5,
518 | "family": "Nowar",
519 | "region": regionalVariant[region]["koKR"],
520 | "feature": ["UI"] + feature,
521 | "encoding": "korean",
522 | }
523 |
524 |
525 | def GetKoreanCombatFont(weight, region, feature):
526 | return {
527 | "weight": weight,
528 | "width": 7,
529 | "family": "Nowar",
530 | "region": regionalVariant[region]["koKR"],
531 | "feature": ["UI"] + feature,
532 | "encoding": "korean",
533 | }
534 |
535 |
536 | def GetKoreanDisplayFont(weight, region, feature):
537 | return {
538 | "weight": weight,
539 | "width": 3,
540 | "family": "Nowar",
541 | "region": regionalVariant[region]["koKR"],
542 | "feature": ["UI"] + feature,
543 | "encoding": "korean",
544 | }
545 |
546 |
547 | def ParamToArgument(param):
548 | js = json.dumps(param, separators=(',', ':'))
549 | return "'{}'".format(js)
550 |
551 |
552 | if __name__ == "__main__":
553 | makefile = {
554 | "variable": {
555 | "VERSION": config.version,
556 | },
557 | "rule": {
558 | ".PHONY": {
559 | "depend": ["all"],
560 | },
561 | "all": {
562 | "depend": [],
563 | },
564 | "clean": {
565 | "command": [
566 | "-rm -rf build/",
567 | "-rm -rf out/??*-???/",
568 | ]
569 | }
570 | },
571 | }
572 |
573 | def powerset(lst): return reduce(lambda result, x: result +
574 | [subset + [x] for subset in result], lst, [[]])
575 |
576 | # font pack for each regional variant and weight
577 | for r, w, fea in product(config.fontPackRegion, config.fontPackWeight, powerset(config.fontPackFeature)):
578 | tagList = [r] + fea
579 | target = "{}-{}".format(TagListToStr(tagList), w)
580 | pack = "out/NowarRounded-{}-${{VERSION}}.7z".format(target)
581 |
582 | makefile["rule"][".PHONY"]["depend"].append(target)
583 | makefile["rule"][target] = {
584 | "depend": [pack],
585 | }
586 |
587 | if fea == [] or (r, fea) in config.fontPackExportFeature:
588 | makefile["rule"]["all"]["depend"].append(pack)
589 |
590 | fontlist = {
591 | "ARIALN": GetCommonChatFont(w, r, fea),
592 | "FRIZQT__": GetCommonFont(w, r, fea),
593 | }
594 |
595 | if regionalVariant[r]["enUS"]:
596 | fontlist.update({
597 | "skurri": GetLatinFont(w, r, fea),
598 | "MORPHEUS": GetLatinChatFont(w, r, fea),
599 | })
600 |
601 | if regionalVariant[r]["ruRU"]:
602 | fontlist.update({
603 | "FRIZQT___CYR": GetLatinFont(w, r, fea),
604 | "SKURRI_CYR": GetLatinFont(w, r, fea),
605 | "MORPHEUS_CYR": GetLatinChatFont(w, r, fea),
606 | })
607 |
608 | if regionalVariant[r]["zhCN"]:
609 | fontlist.update({
610 | "ARKai_C": GetHansCombatFont(w, r, fea),
611 | "ARKai_T": GetHansFont(w, r, fea),
612 | "ARHei": GetHansChatFont(w, r, fea),
613 | })
614 |
615 | if regionalVariant[r]["zhTW"]:
616 | fontlist.update({
617 | "arheiuhk_bd": GetHantChatFont(w, r, fea),
618 | "bHEI00M": GetHantNoteFont(w, r, fea),
619 | "bHEI01B": GetHantChatFont(w, r, fea),
620 | "bKAI00M": GetHantCombatFont(w, r, fea),
621 | "blei00d": GetHantFont(w, r, fea),
622 | })
623 |
624 | if regionalVariant[r]["koKR"]:
625 | fontlist.update({
626 | "2002": GetKoreanFont(w, r, fea),
627 | "2002B": GetKoreanFont(w, r, fea),
628 | "K_Damage": GetKoreanCombatFont(w, r, fea),
629 | "K_Pagetext": GetKoreanDisplayFont(w, r, fea),
630 | })
631 |
632 | makefile["rule"][pack] = {
633 | "depend": ["out/{}/Fonts/{}.ttf".format(target, f) for f in fontlist],
634 | "command": [
635 | "cd out/{};".format(target) +
636 | "cp ../../LICENSE.txt Fonts/LICENSE.txt;" +
637 | "7z a -t7z -m0=LZMA:d=512m:fb=273 -ms ../../$@ Fonts/"
638 | ]
639 | }
640 |
641 | for f, p in fontlist.items():
642 | makefile["rule"]["out/{}/Fonts/{}.ttf".format(target, f)] = {
643 | "depend": ["build/nowar/{}.ttf".format(GenerateFilename(p))],
644 | "command": [
645 | "mkdir -p out/{}/Fonts".format(target),
646 | "cp $^ $@",
647 | ]
648 | }
649 |
650 | # otf files
651 | for w, wd, r, fea in product(config.fontPackWeight, [3, 5, 7, 10], regionNameMap.keys(), powerset(featureNameMap.keys())):
652 | param = {
653 | "family": "Nowar",
654 | "weight": w,
655 | "width": wd,
656 | "region": r,
657 | "feature": fea,
658 | "encoding": "unspec",
659 | }
660 | makefile["rule"]["build/nowar/{}.ttf".format(GenerateFilename(param))] = {
661 | "depend": ["build/nowar/{}.otd".format(GenerateFilename(param))],
662 | "command": ["otfccbuild -q -O3 --keep-average-char-width $< -o $@"]
663 | }
664 | dep = ResolveDependency(param)
665 | makefile["rule"]["build/nowar/{}.otd".format(GenerateFilename(param))] = {
666 | "depend": [
667 | "build/noto/{}.otd".format(GenerateFilename(dep["Latin"])),
668 | "build/rhr/{}.otd".format(
669 | GenerateFilename(dep["CJK"])),
670 | ] + ([
671 | "build/noto/{}.otd".format(
672 | GenerateFilename(dep["Numeral"]))
673 | ] if "Numeral" in dep else []),
674 | "command": [
675 | "mkdir -p build/nowar/",
676 | "python merge.py {}".format(ParamToArgument(param))
677 | ]
678 | }
679 | makefile["rule"]["build/noto/{}.otd".format(GenerateFilename(dep["Latin"]))] = {
680 | "depend": ["source/noto/{}.ttf".format(GenerateFilename(dep["Latin"]))],
681 | "command": [
682 | "mkdir -p build/noto/",
683 | "otfccdump --no-bom --glyph-name-prefix latn --ignore-hints $< | python round.py {} >$@".format(ParamToArgument({"weight": w})),
684 | ]
685 | }
686 | if "Numeral" in dep:
687 | makefile["rule"]["build/noto/{}.otd".format(GenerateFilename(dep["Numeral"]))] = {
688 | "depend": ["source/noto/{}.ttf".format(GenerateFilename(dep["Numeral"]))],
689 | "command": [
690 | "mkdir -p build/noto/",
691 | "otfccdump --no-bom --glyph-name-prefix latn --ignore-hints $< | python round.py {} >$@".format(ParamToArgument({"weight": w})),
692 | ]
693 | }
694 | makefile["rule"]["build/rhr/{}.otd".format(GenerateFilename(dep["CJK"]))] = {
695 | "depend": ["source/rhr/{}.ttf".format(GenerateFilename(dep["CJK"]))],
696 | "command": [
697 | "mkdir -p build/rhr/",
698 | "otfccdump --glyph-name-prefix hani --ignore-hints $< -o $@",
699 | ]
700 | }
701 |
702 | # set encoding
703 | for e in ["gbk", "big5", "jis", "korean"]:
704 | enc = {
705 | "family": "Nowar",
706 | "weight": w,
707 | "width": wd,
708 | "region": r,
709 | "feature": fea,
710 | "encoding": e,
711 | }
712 | makefile["rule"]["build/nowar/{}.ttf".format(GenerateFilename(enc))] = {
713 | "depend": ["build/nowar/{}.otd".format(GenerateFilename(enc))],
714 | "command": ["otfccbuild -q -O3 --keep-average-char-width $< -o $@"]
715 | }
716 | makefile["rule"]["build/nowar/{}.otd".format(GenerateFilename(enc))] = {
717 | "depend": ["build/nowar/{}.otd".format(GenerateFilename(param))],
718 | "command": ["python set-encoding.py {}".format(ParamToArgument(enc))]
719 | }
720 |
721 | # dump `makefile` dict to actual “GNU Makefile”
722 | makedump = ""
723 |
724 | for var, val in makefile["variable"].items():
725 | makedump += "{}={}\n".format(var, val)
726 |
727 | for tar, recipe in makefile["rule"].items():
728 | dep = recipe["depend"] if "depend" in recipe else []
729 | makedump += "{}: {}\n".format(tar, " ".join(dep))
730 | com = recipe["command"] if "command" in recipe else []
731 | for c in com:
732 | makedump += "\t{}\n".format(c)
733 |
734 | with codecs.open("Makefile", 'w', 'UTF-8') as mf:
735 | mf.write(makedump)
736 |
--------------------------------------------------------------------------------
/merge.py:
--------------------------------------------------------------------------------
1 | import datetime
2 | import sys
3 | import copy
4 | import json
5 | import codecs
6 | from libotd.rebase import Rebase
7 | from libotd.dereference import Dereference
8 | from libotd.merge import MergeBelow, MergeAbove
9 | from libotd.pkana import ApplyPalt, NowarApplyPaltMultiplied
10 | from libotd.transform import Transform, ChangeAdvanceWidth
11 | from libotd.gsub import GetGsubFlat, ApplyGsubSingle
12 | from libotd.gc import Gc, Consolidate, NowarRemoveFeatures
13 | import configure
14 |
15 |
16 | def NameFont(param, font):
17 | fontName = configure.GenerateFontName(param)
18 | family, subfamily = fontName["typographic"]
19 | wwsF, wwsSf = fontName["wws"]
20 | legacyF, legacySf = fontName["legacy"]
21 | friendly = fontName["friendly"]
22 | postscript = fontName["postscript"]
23 | enUS = configure.LanguageId.enUS
24 |
25 | os_2 = font["OS_2"]
26 | fsSelection = os_2["fsSelection"]
27 | head = font["head"]
28 | macStyle = font["head"]["macStyle"]
29 | weight = param["weight"]
30 | width = param["width"]
31 | slant = param.get("slant")
32 |
33 | head['fontRevision'] = configure.config.fontRevision
34 | os_2['achVendID'] = configure.config.vendorId
35 | os_2['usWeightClass'] = weight
36 | # Warcraft numeral hack
37 | os_2['usWidthClass'] = 5 if width == 10 else width
38 | fsSelection["wws"] = False
39 |
40 | fsSelection["regular"] = (weight == 400) and (not slant) and (width == 5)
41 | if weight == 700:
42 | fsSelection["bold"] = True
43 | macStyle["bold"] = True
44 | if slant == "Italic":
45 | fsSelection["italic"] = True
46 | macStyle["italic"] = True
47 | elif slant == "Oblique":
48 | fsSelection["oblique"] = True
49 |
50 | font['name'] = [
51 | {
52 | "platformID": 3,
53 | "encodingID": 1,
54 | "languageID": enUS,
55 | "nameID": 0,
56 | "nameString": configure.config.copyright
57 | },
58 | {
59 | "platformID": 3,
60 | "encodingID": 1,
61 | "languageID": enUS,
62 | "nameID": 2,
63 | "nameString": legacySf
64 | },
65 | {
66 | "platformID": 3,
67 | "encodingID": 1,
68 | "languageID": enUS,
69 | "nameID": 3,
70 | "nameString": "{}: {} {}".format(configure.config.vendorId, friendly[enUS], configure.config.version)
71 | },
72 | {
73 | "platformID": 3,
74 | "encodingID": 1,
75 | "languageID": enUS,
76 | "nameID": 5,
77 | "nameString": configure.config.version
78 | },
79 | {
80 | "platformID": 3,
81 | "encodingID": 1,
82 | "languageID": enUS,
83 | "nameID": 6,
84 | "nameString": postscript
85 | },
86 | {
87 | "platformID": 3,
88 | "encodingID": 1,
89 | "languageID": enUS,
90 | "nameID": 8,
91 | "nameString": configure.config.vendor
92 | },
93 | {
94 | "platformID": 3,
95 | "encodingID": 1,
96 | "languageID": enUS,
97 | "nameID": 9,
98 | "nameString": configure.config.designer
99 | },
100 | {
101 | "platformID": 3,
102 | "encodingID": 1,
103 | "languageID": enUS,
104 | "nameID": 11,
105 | "nameString": configure.config.vendorUrl
106 | },
107 | {
108 | "platformID": 3,
109 | "encodingID": 1,
110 | "languageID": enUS,
111 | "nameID": 12,
112 | "nameString": configure.config.designerUrl
113 | },
114 | {
115 | "platformID": 3,
116 | "encodingID": 1,
117 | "languageID": enUS,
118 | "nameID": 13,
119 | "nameString": configure.config.license
120 | },
121 | {
122 | "platformID": 3,
123 | "encodingID": 1,
124 | "languageID": enUS,
125 | "nameID": 14,
126 | "nameString": configure.config.licenseUrl
127 | },
128 | {
129 | "platformID": 3,
130 | "encodingID": 1,
131 | "languageID": enUS,
132 | "nameID": 17,
133 | "nameString": subfamily
134 | },
135 | {
136 | "platformID": 3,
137 | "encodingID": 1,
138 | "languageID": enUS,
139 | "nameID": 22,
140 | "nameString": wwsSf
141 | },
142 | ] + sum(
143 | [[
144 | {
145 | "platformID": 3,
146 | "encodingID": 1,
147 | "languageID": langId,
148 | "nameID": 1,
149 | "nameString": legacyF[langId]
150 | },
151 | {
152 | "platformID": 3,
153 | "encodingID": 1,
154 | "languageID": langId,
155 | "nameID": 4,
156 | "nameString": friendly[langId]
157 | },
158 | {
159 | "platformID": 3,
160 | "encodingID": 1,
161 | "languageID": langId,
162 | "nameID": 16,
163 | "nameString": family[langId]
164 | },
165 | {
166 | "platformID": 3,
167 | "encodingID": 1,
168 | "languageID": langId,
169 | "nameID": 21,
170 | "nameString": wwsF[langId]
171 | },
172 | ] for langId in configure.LanguageId],
173 | []
174 | )
175 |
176 | if 'CFF_' in font:
177 | cff = font['CFF_']
178 | cff['version'] = configure.config.version
179 | if 'notice' in cff:
180 | del cff['notice']
181 | cff['copyright'] = configure.config.copyright
182 | cff['fontName'] = postscript
183 | cff['fullName'] = friendly[enUS]
184 | cff['familyName'] = family[enUS]
185 | cff['weight'] = subfamily
186 |
187 |
188 | def GenerateAsianSymbolFont(font):
189 | asianSymbol = [
190 | 0x00B7, # MIDDLE DOT
191 | 0x2014, # EM DASH
192 | 0x2015, # HORIZONTAL BAR
193 | 0x2018, # LEFT SINGLE QUOTATION MARK
194 | 0x2019, # RIGHT SINGLE QUOTATION MARK
195 | 0x201C, # LEFT DOUBLE QUOTATION MARK
196 | 0x201D, # RIGHT DOUBLE QUOTATION MARK
197 | 0x2026, # HORIZONTAL ELLIPSIS
198 | 0x2027, # HYPHENATION POINT
199 | 0x2E3A, # TWO-EM DASH
200 | 0x2E3B, # THREE-EM DASH
201 | ]
202 | symbolFont = {}
203 | symbolFont["cmap"] = {k: v for k,
204 | v in font["cmap"].items() if int(k) in asianSymbol}
205 | glyphSet = {symbolFont["cmap"].values()}
206 | symbolFont["glyf"] = {k: v for k,
207 | v in font["glyf"].items() if k in glyphSet}
208 | symbolFont["glyph_order"] = ["symb.notdef"]
209 | return symbolFont
210 |
211 |
212 | def Simplify(font):
213 | from opencc_t2s import OpenCC_T2S
214 | cmap = asianFont['cmap']
215 | for t, s in OpenCC_T2S.items():
216 | us = str(ord(s))
217 | if us in cmap:
218 | ut = str(ord(t))
219 | cmap[ut] = cmap[us]
220 |
221 |
222 | if __name__ == '__main__':
223 | param = sys.argv[1]
224 | param = json.loads(param)
225 |
226 | dep = configure.ResolveDependency(param)
227 |
228 | with open("build/noto/{}.otd".format(configure.GenerateFilename(dep['Latin'])), 'rb') as baseFile:
229 | baseFont = json.loads(
230 | baseFile.read().decode('UTF-8', errors='replace'))
231 | upm = baseFont["head"]["unitsPerEm"]
232 | if (upm != 1000):
233 | Rebase(baseFont, 1000 / upm, roundToInt=True)
234 | NameFont(param, baseFont)
235 |
236 | hhea = baseFont["hhea"]
237 | os_2 = baseFont["OS_2"]
238 | if os_2["version"] < 4:
239 | os_2["version"] = 4
240 | hhea['ascender'] = 880
241 | hhea['descender'] = -120
242 | hhea['lineGap'] = 200
243 | os_2['sTypoAscender'] = 880
244 | os_2['sTypoDescender'] = -120
245 | os_2['sTypoLineGap'] = 200
246 | os_2['fsSelection']['useTypoMetrics'] = True
247 | os_2['usWinAscent'] = 1050
248 | os_2['usWinDescent'] = 300
249 |
250 | # oldstyle figure
251 | if "OSF" in param["feature"]:
252 | ApplyGsubSingle('pnum', baseFont)
253 | ApplyGsubSingle('onum', baseFont)
254 |
255 | # small caps
256 | if "SC" in param["feature"]:
257 | ApplyGsubSingle('smcp', baseFont)
258 |
259 | # Warcraft numeral hack
260 | if param["width"] == 10:
261 | with open("build/noto/{}.otd".format(configure.GenerateFilename(dep['Numeral'])), 'rb') as numFile:
262 | numFont = json.loads(
263 | numFile.read().decode('UTF-8', errors='replace'))
264 | if (upm != 1000):
265 | Rebase(numFont, 1000 / upm, roundToInt=True)
266 |
267 | gsubPnum = GetGsubFlat('pnum', numFont)
268 | gsubTnum = GetGsubFlat('tnum', numFont)
269 | gsubOnum = GetGsubFlat('onum', numFont)
270 |
271 | num = [numFont['cmap'][str(ord('0') + i)] for i in range(10)]
272 | pnum = [gsubPnum[n] for n in num]
273 | onum = [gsubOnum[n] for n in pnum]
274 | tonum = [gsubOnum[n] for n in num]
275 |
276 | maxWidth = 490
277 | numWidth = numFont['glyf'][num[0]]['advanceWidth']
278 | changeWidth = maxWidth - numWidth if numWidth > maxWidth else 0
279 |
280 | # dereference TT glyphs
281 | if "CFF_" not in numFont:
282 | for n in num + pnum + onum + tonum:
283 | numFont['glyf'][n] = Dereference(
284 | numFont['glyf'][n], numFont)
285 |
286 | for n in num + tonum:
287 | tGlyph = numFont['glyf'][n]
288 | tWidth = tGlyph['advanceWidth']
289 | pName = gsubPnum[n]
290 | pGlyph = numFont['glyf'][pName]
291 | pWidth = pGlyph['advanceWidth']
292 | if pWidth > tWidth:
293 | numFont['glyf'][pName] = copy.deepcopy(tGlyph)
294 | pGlyph = numFont['glyf'][pName]
295 | pWidth = tWidth
296 | if changeWidth != 0:
297 | ChangeAdvanceWidth(pGlyph, changeWidth)
298 | Transform(pGlyph, 1, 0, 0, 1, (changeWidth + 1) // 2, 0)
299 |
300 | for n in num + pnum + onum + tonum:
301 | baseFont['glyf'][n] = numFont['glyf'][n]
302 | ApplyGsubSingle('pnum', baseFont)
303 |
304 | with open("build/rhr/{}.otd".format(configure.GenerateFilename(dep['CJK'])), 'rb') as asianFile:
305 | asianFont = json.loads(
306 | asianFile.read().decode('UTF-8', errors='replace'))
307 |
308 | # pre-apply `palt` in UI family
309 | if "UI" in param["feature"]:
310 | ApplyPalt(asianFont)
311 | else:
312 | NowarApplyPaltMultiplied(asianFont, 0.4)
313 | asianSymbolFont = GenerateAsianSymbolFont(asianFont)
314 | MergeAbove(baseFont, asianSymbolFont)
315 |
316 | # pseudo-simplified font
317 | if "Simp" in param["feature"]:
318 | Simplify(asianFont)
319 |
320 | NowarRemoveFeatures(asianFont)
321 | MergeBelow(baseFont, asianFont)
322 |
323 | # remap `丶` to `·` in RP variant
324 | if "RP" in param["feature"]:
325 | baseFont['cmap'][str(ord('丶'))] = baseFont['cmap'][str(ord('·'))]
326 |
327 | Gc(baseFont)
328 | Consolidate(baseFont)
329 | outStr = json.dumps(baseFont, ensure_ascii=False, separators=(',', ':'))
330 | with codecs.open("build/nowar/{}.otd".format(configure.GenerateFilename(param)), 'w', 'UTF-8') as outFile:
331 | outFile.write(outStr)
332 |
--------------------------------------------------------------------------------
/opencc_t2s.py:
--------------------------------------------------------------------------------
1 | OpenCC_T2S = {
2 | "㑮": "𫝈",
3 | "㑯": "㑔",
4 | "㑳": "㑇",
5 | "㑶": "㐹",
6 | "㒓": "𠉂",
7 | "㓄": "𪠟",
8 | "㓨": "刾",
9 | "㔋": "𪟎",
10 | "㖮": "𪠵",
11 | "㗲": "𠵾",
12 | "㗿": "𪡛",
13 | "㘉": "𠰱",
14 | "㘓": "𪢌",
15 | "㘔": "㗷",
16 | "㘚": "㘎",
17 | "㛝": "𫝦",
18 | "㜄": "㚯",
19 | "㜏": "㛣",
20 | "㜐": "𫝧",
21 | "㜗": "𡞋",
22 | "㜢": "𡞱",
23 | "㜷": "𡝠",
24 | "㞞": "𪨊",
25 | "㟺": "𪩇",
26 | "㠏": "㟆",
27 | "㢗": "𪪑",
28 | "㢝": "𢋈",
29 | "㥮": "㤘",
30 | "㦎": "𢛯",
31 | "㦛": "𢗓",
32 | "㦞": "𪫷",
33 | "㨻": "𪮃",
34 | "㩋": "𪮋",
35 | "㩜": "㨫",
36 | "㩳": "㧐",
37 | "㩵": "擜",
38 | "㪎": "𪯋",
39 | "㯤": "𣘐",
40 | "㰙": "𣗙",
41 | "㵗": "𣳆",
42 | "㵾": "𪷍",
43 | "㶆": "𫞛",
44 | "㷍": "𤆢",
45 | "㷿": "𤈷",
46 | "㸇": "𤎺",
47 | "㹽": "𫞣",
48 | "㺏": "𤠋",
49 | "㺜": "𪺻",
50 | "㻶": "𪼋",
51 | "㿖": "𪽮",
52 | "㿗": "𤻊",
53 | "㿧": "𤽯",
54 | "䀉": "𥁢",
55 | "䀹": "𥅴",
56 | "䁪": "𥇢",
57 | "䁻": "䀥",
58 | "䂎": "𥎝",
59 | "䃮": "鿎",
60 | "䅐": "𫀨",
61 | "䅳": "𫀬",
62 | "䆉": "𫁂",
63 | "䉑": "𫁲",
64 | "䉙": "𥬀",
65 | "䉬": "𫂈",
66 | "䉲": "𥮜",
67 | "䉶": "𫁷",
68 | "䊭": "𥺅",
69 | "䊷": "䌶",
70 | "䊺": "𫄚",
71 | "䋃": "𫄜",
72 | "䋔": "𫄞",
73 | "䋙": "䌺",
74 | "䋚": "䌻",
75 | "䋦": "𫄩",
76 | "䋹": "䌿",
77 | "䋻": "䌾",
78 | "䋼": "𫄮",
79 | "䋿": "𦈓",
80 | "䌈": "𦈖",
81 | "䌋": "𦈘",
82 | "䌖": "𦈜",
83 | "䌝": "𦈟",
84 | "䌟": "𦈞",
85 | "䌥": "𦈠",
86 | "䌰": "𦈙",
87 | "䍤": "𫅅",
88 | "䍦": "䍠",
89 | "䍽": "𦍠",
90 | "䎙": "𫅭",
91 | "䎱": "䎬",
92 | "䕤": "𫟕",
93 | "䕳": "𦰴",
94 | "䖅": "𫟑",
95 | "䗅": "𫊪",
96 | "䗿": "𧉞",
97 | "䙔": "𫋲",
98 | "䙡": "䙌",
99 | "䙱": "𧜭",
100 | "䚩": "𫌯",
101 | "䛄": "𫍠",
102 | "䛳": "𫍫",
103 | "䜀": "䜧",
104 | "䜖": "𫟢",
105 | "䝭": "𫎧",
106 | "䝻": "𧹕",
107 | "䝼": "䞍",
108 | "䞈": "𧹑",
109 | "䞋": "𫎪",
110 | "䞓": "𫎭",
111 | "䟃": "𫎺",
112 | "䟆": "𫎳",
113 | "䟐": "𫎱",
114 | "䠆": "𫏃",
115 | "䠱": "𨅛",
116 | "䡐": "𫟤",
117 | "䡩": "𫟥",
118 | "䡵": "𫟦",
119 | "䢨": "𨑹",
120 | "䤤": "𫟺",
121 | "䥄": "𫠀",
122 | "䥇": "䦂",
123 | "䥑": "鿏",
124 | "䥗": "𫔋",
125 | "䥩": "𨱖",
126 | "䥯": "𫔆",
127 | "䥱": "䥾",
128 | "䦘": "𨸄",
129 | "䦛": "䦶",
130 | "䦟": "䦷",
131 | "䦯": "𫔵",
132 | "䦳": "𨷿",
133 | "䧢": "𨸟",
134 | "䪊": "𫖅",
135 | "䪏": "𩏼",
136 | "䪗": "𩐀",
137 | "䪘": "𩏿",
138 | "䪴": "𫖫",
139 | "䪾": "𫖬",
140 | "䫀": "𫖱",
141 | "䫂": "𫖰",
142 | "䫟": "𫖲",
143 | "䫴": "𩖗",
144 | "䫶": "𫖺",
145 | "䫻": "𫗇",
146 | "䫾": "𫠈",
147 | "䬓": "𫗊",
148 | "䬘": "𩙮",
149 | "䬝": "𩙯",
150 | "䬞": "𩙧",
151 | "䬧": "𫗟",
152 | "䭀": "𩠇",
153 | "䭃": "𩠈",
154 | "䭑": "𫗱",
155 | "䭔": "𫗰",
156 | "䭿": "𩧭",
157 | "䮄": "𫠊",
158 | "䮝": "𩧰",
159 | "䮞": "𩨁",
160 | "䮠": "𩧿",
161 | "䮫": "𩨇",
162 | "䮰": "𫘮",
163 | "䮳": "𩨏",
164 | "䮾": "𩧪",
165 | "䯀": "䯅",
166 | "䯤": "𩩈",
167 | "䰾": "鲃",
168 | "䱀": "𫚐",
169 | "䱁": "𫚏",
170 | "䱙": "𩾈",
171 | "䱧": "𫚠",
172 | "䱬": "𩾊",
173 | "䱰": "𩾋",
174 | "䱷": "䲣",
175 | "䱸": "𫠑",
176 | "䱽": "䲝",
177 | "䲁": "鳚",
178 | "䲅": "𫚜",
179 | "䲖": "𩾂",
180 | "䲘": "鳤",
181 | "䲰": "𪉂",
182 | "䳜": "𫛬",
183 | "䳢": "𫛰",
184 | "䳤": "𫛮",
185 | "䳧": "𫛺",
186 | "䳫": "𫛼",
187 | "䴉": "鹮",
188 | "䴋": "𫜅",
189 | "䴬": "𪎈",
190 | "䴱": "𫜒",
191 | "䴴": "𪎋",
192 | "䴽": "𫜔",
193 | "䵳": "𪑅",
194 | "䵴": "𫜙",
195 | "䶕": "𫜨",
196 | "䶲": "𫜳",
197 | "丟": "丢",
198 | "並": "并",
199 | "乾": "干",
200 | "亂": "乱",
201 | "亙": "亘",
202 | "亞": "亚",
203 | "佇": "伫",
204 | "佈": "布",
205 | "佔": "占",
206 | "併": "并",
207 | "來": "来",
208 | "侖": "仑",
209 | "侶": "侣",
210 | "侷": "局",
211 | "俁": "俣",
212 | "係": "系",
213 | "俓": "𠇹",
214 | "俔": "伣",
215 | "俠": "侠",
216 | "俥": "伡",
217 | "俬": "私",
218 | "倀": "伥",
219 | "倆": "俩",
220 | "倈": "俫",
221 | "倉": "仓",
222 | "個": "个",
223 | "們": "们",
224 | "倖": "幸",
225 | "倫": "伦",
226 | "倲": "㑈",
227 | "偉": "伟",
228 | "偑": "㐽",
229 | "側": "侧",
230 | "偵": "侦",
231 | "偽": "伪",
232 | "傌": "㐷",
233 | "傑": "杰",
234 | "傖": "伧",
235 | "傘": "伞",
236 | "備": "备",
237 | "傢": "家",
238 | "傭": "佣",
239 | "傯": "偬",
240 | "傳": "传",
241 | "傴": "伛",
242 | "債": "债",
243 | "傷": "伤",
244 | "傾": "倾",
245 | "僂": "偻",
246 | "僅": "仅",
247 | "僉": "佥",
248 | "僑": "侨",
249 | "僕": "仆",
250 | "僞": "伪",
251 | "僥": "侥",
252 | "僨": "偾",
253 | "僱": "雇",
254 | "價": "价",
255 | "儀": "仪",
256 | "儁": "俊",
257 | "儂": "侬",
258 | "億": "亿",
259 | "儈": "侩",
260 | "儉": "俭",
261 | "儎": "傤",
262 | "儐": "傧",
263 | "儔": "俦",
264 | "儕": "侪",
265 | "儘": "尽",
266 | "償": "偿",
267 | "儣": "𠆲",
268 | "優": "优",
269 | "儭": "𠋆",
270 | "儲": "储",
271 | "儷": "俪",
272 | "儸": "㑩",
273 | "儺": "傩",
274 | "儻": "傥",
275 | "儼": "俨",
276 | "兇": "凶",
277 | "兌": "兑",
278 | "兒": "儿",
279 | "兗": "兖",
280 | "內": "内",
281 | "兩": "两",
282 | "冊": "册",
283 | "冑": "胄",
284 | "冪": "幂",
285 | "凈": "净",
286 | "凍": "冻",
287 | "凙": "𪞝",
288 | "凜": "凛",
289 | "凱": "凯",
290 | "別": "别",
291 | "刪": "删",
292 | "剄": "刭",
293 | "則": "则",
294 | "剋": "克",
295 | "剎": "刹",
296 | "剗": "刬",
297 | "剛": "刚",
298 | "剝": "剥",
299 | "剮": "剐",
300 | "剴": "剀",
301 | "創": "创",
302 | "剷": "铲",
303 | "剾": "𠛅",
304 | "劃": "划",
305 | "劇": "剧",
306 | "劉": "刘",
307 | "劊": "刽",
308 | "劌": "刿",
309 | "劍": "剑",
310 | "劏": "㓥",
311 | "劑": "剂",
312 | "劚": "㔉",
313 | "勁": "劲",
314 | "勑": "𠡠",
315 | "動": "动",
316 | "務": "务",
317 | "勛": "勋",
318 | "勝": "胜",
319 | "勞": "劳",
320 | "勢": "势",
321 | "勣": "𪟝",
322 | "勩": "勚",
323 | "勱": "劢",
324 | "勳": "勋",
325 | "勵": "励",
326 | "勸": "劝",
327 | "勻": "匀",
328 | "匭": "匦",
329 | "匯": "汇",
330 | "匱": "匮",
331 | "區": "区",
332 | "協": "协",
333 | "卹": "恤",
334 | "卻": "却",
335 | "卽": "即",
336 | "厙": "厍",
337 | "厠": "厕",
338 | "厤": "历",
339 | "厭": "厌",
340 | "厲": "厉",
341 | "厴": "厣",
342 | "參": "参",
343 | "叄": "叁",
344 | "叢": "丛",
345 | "吒": "咤",
346 | "吳": "吴",
347 | "吶": "呐",
348 | "呂": "吕",
349 | "咼": "呙",
350 | "員": "员",
351 | "哯": "𠯟",
352 | "唄": "呗",
353 | "唓": "𪠳",
354 | "唚": "吣",
355 | "唸": "念",
356 | "問": "问",
357 | "啓": "启",
358 | "啞": "哑",
359 | "啟": "启",
360 | "啢": "唡",
361 | "喎": "㖞",
362 | "喚": "唤",
363 | "喪": "丧",
364 | "喫": "吃",
365 | "喬": "乔",
366 | "單": "单",
367 | "喲": "哟",
368 | "嗆": "呛",
369 | "嗇": "啬",
370 | "嗊": "唝",
371 | "嗎": "吗",
372 | "嗚": "呜",
373 | "嗩": "唢",
374 | "嗰": "𠮶",
375 | "嗶": "哔",
376 | "嗹": "𪡏",
377 | "嘆": "叹",
378 | "嘍": "喽",
379 | "嘓": "啯",
380 | "嘔": "呕",
381 | "嘖": "啧",
382 | "嘗": "尝",
383 | "嘜": "唛",
384 | "嘩": "哗",
385 | "嘪": "𪡃",
386 | "嘮": "唠",
387 | "嘯": "啸",
388 | "嘰": "叽",
389 | "嘳": "𪡞",
390 | "嘵": "哓",
391 | "嘸": "呒",
392 | "嘺": "𪡀",
393 | "嘽": "啴",
394 | "噁": "恶",
395 | "噅": "𠯠",
396 | "噓": "嘘",
397 | "噚": "㖊",
398 | "噝": "咝",
399 | "噞": "𪡋",
400 | "噠": "哒",
401 | "噥": "哝",
402 | "噦": "哕",
403 | "噯": "嗳",
404 | "噲": "哙",
405 | "噴": "喷",
406 | "噸": "吨",
407 | "噹": "当",
408 | "嚀": "咛",
409 | "嚇": "吓",
410 | "嚌": "哜",
411 | "嚐": "尝",
412 | "嚕": "噜",
413 | "嚙": "啮",
414 | "嚛": "𪠸",
415 | "嚥": "咽",
416 | "嚦": "呖",
417 | "嚧": "𠰷",
418 | "嚨": "咙",
419 | "嚮": "向",
420 | "嚲": "亸",
421 | "嚳": "喾",
422 | "嚴": "严",
423 | "嚶": "嘤",
424 | "嚽": "𪢕",
425 | "囀": "啭",
426 | "囁": "嗫",
427 | "囂": "嚣",
428 | "囃": "𠱞",
429 | "囅": "冁",
430 | "囈": "呓",
431 | "囉": "啰",
432 | "囌": "苏",
433 | "囑": "嘱",
434 | "囒": "𪢠",
435 | "囪": "囱",
436 | "圇": "囵",
437 | "國": "国",
438 | "圍": "围",
439 | "園": "园",
440 | "圓": "圆",
441 | "圖": "图",
442 | "團": "团",
443 | "圞": "𪢮",
444 | "垵": "埯",
445 | "埡": "垭",
446 | "埬": "𪣆",
447 | "埰": "采",
448 | "執": "执",
449 | "堅": "坚",
450 | "堊": "垩",
451 | "堖": "垴",
452 | "堚": "𪣒",
453 | "堝": "埚",
454 | "堯": "尧",
455 | "報": "报",
456 | "場": "场",
457 | "塊": "块",
458 | "塋": "茔",
459 | "塏": "垲",
460 | "塒": "埘",
461 | "塗": "涂",
462 | "塚": "冢",
463 | "塢": "坞",
464 | "塤": "埙",
465 | "塵": "尘",
466 | "塹": "堑",
467 | "塿": "𪣻",
468 | "墊": "垫",
469 | "墜": "坠",
470 | "墮": "堕",
471 | "墰": "坛",
472 | "墲": "𪢸",
473 | "墳": "坟",
474 | "墶": "垯",
475 | "墻": "墙",
476 | "墾": "垦",
477 | "壇": "坛",
478 | "壈": "𡒄",
479 | "壋": "垱",
480 | "壎": "埙",
481 | "壓": "压",
482 | "壗": "𡋤",
483 | "壘": "垒",
484 | "壙": "圹",
485 | "壚": "垆",
486 | "壜": "坛",
487 | "壞": "坏",
488 | "壟": "垄",
489 | "壠": "垅",
490 | "壢": "坜",
491 | "壣": "𪤚",
492 | "壩": "坝",
493 | "壪": "塆",
494 | "壯": "壮",
495 | "壺": "壶",
496 | "壼": "壸",
497 | "壽": "寿",
498 | "夠": "够",
499 | "夢": "梦",
500 | "夥": "伙",
501 | "夾": "夹",
502 | "奐": "奂",
503 | "奧": "奥",
504 | "奩": "奁",
505 | "奪": "夺",
506 | "奬": "奖",
507 | "奮": "奋",
508 | "奼": "姹",
509 | "妝": "妆",
510 | "姍": "姗",
511 | "姦": "奸",
512 | "娛": "娱",
513 | "婁": "娄",
514 | "婡": "𫝫",
515 | "婦": "妇",
516 | "婭": "娅",
517 | "媈": "𫝨",
518 | "媧": "娲",
519 | "媯": "妫",
520 | "媰": "㛀",
521 | "媼": "媪",
522 | "媽": "妈",
523 | "嫋": "袅",
524 | "嫗": "妪",
525 | "嫵": "妩",
526 | "嫺": "娴",
527 | "嫻": "娴",
528 | "嫿": "婳",
529 | "嬀": "妫",
530 | "嬃": "媭",
531 | "嬇": "𫝬",
532 | "嬈": "娆",
533 | "嬋": "婵",
534 | "嬌": "娇",
535 | "嬙": "嫱",
536 | "嬡": "嫒",
537 | "嬣": "𪥰",
538 | "嬤": "嬷",
539 | "嬦": "𫝩",
540 | "嬪": "嫔",
541 | "嬰": "婴",
542 | "嬸": "婶",
543 | "嬻": "𪥿",
544 | "孃": "娘",
545 | "孄": "𫝮",
546 | "孆": "𫝭",
547 | "孇": "𪥫",
548 | "孋": "㛤",
549 | "孌": "娈",
550 | "孎": "𡠟",
551 | "孫": "孙",
552 | "學": "学",
553 | "孻": "𡥧",
554 | "孾": "𪧀",
555 | "孿": "孪",
556 | "宮": "宫",
557 | "寀": "采",
558 | "寠": "𪧘",
559 | "寢": "寝",
560 | "實": "实",
561 | "寧": "宁",
562 | "審": "审",
563 | "寫": "写",
564 | "寬": "宽",
565 | "寵": "宠",
566 | "寶": "宝",
567 | "將": "将",
568 | "專": "专",
569 | "尋": "寻",
570 | "對": "对",
571 | "導": "导",
572 | "尷": "尴",
573 | "屆": "届",
574 | "屍": "尸",
575 | "屓": "屃",
576 | "屜": "屉",
577 | "屢": "屡",
578 | "層": "层",
579 | "屨": "屦",
580 | "屩": "𪨗",
581 | "屬": "属",
582 | "岡": "冈",
583 | "峯": "峰",
584 | "峴": "岘",
585 | "島": "岛",
586 | "峽": "峡",
587 | "崍": "崃",
588 | "崑": "昆",
589 | "崗": "岗",
590 | "崙": "仑",
591 | "崢": "峥",
592 | "崬": "岽",
593 | "嵐": "岚",
594 | "嵗": "岁",
595 | "嵼": "𡶴",
596 | "嵾": "㟥",
597 | "嶁": "嵝",
598 | "嶄": "崭",
599 | "嶇": "岖",
600 | "嶈": "𡺃",
601 | "嶔": "嵚",
602 | "嶗": "崂",
603 | "嶘": "𡺄",
604 | "嶠": "峤",
605 | "嶢": "峣",
606 | "嶧": "峄",
607 | "嶨": "峃",
608 | "嶮": "崄",
609 | "嶴": "岙",
610 | "嶸": "嵘",
611 | "嶹": "𫝵",
612 | "嶺": "岭",
613 | "嶼": "屿",
614 | "嶽": "岳",
615 | "巊": "𪩎",
616 | "巋": "岿",
617 | "巒": "峦",
618 | "巔": "巅",
619 | "巖": "岩",
620 | "巗": "𪨷",
621 | "巘": "𪩘",
622 | "巰": "巯",
623 | "巹": "卺",
624 | "帥": "帅",
625 | "師": "师",
626 | "帳": "帐",
627 | "帶": "带",
628 | "幀": "帧",
629 | "幃": "帏",
630 | "幓": "㡎",
631 | "幗": "帼",
632 | "幘": "帻",
633 | "幝": "𪩷",
634 | "幟": "帜",
635 | "幣": "币",
636 | "幩": "𪩸",
637 | "幫": "帮",
638 | "幬": "帱",
639 | "幹": "干",
640 | "幾": "几",
641 | "庫": "库",
642 | "廁": "厕",
643 | "廂": "厢",
644 | "廄": "厩",
645 | "廈": "厦",
646 | "廎": "庼",
647 | "廕": "荫",
648 | "廚": "厨",
649 | "廝": "厮",
650 | "廟": "庙",
651 | "廠": "厂",
652 | "廡": "庑",
653 | "廢": "废",
654 | "廣": "广",
655 | "廧": "𪪞",
656 | "廩": "廪",
657 | "廬": "庐",
658 | "廳": "厅",
659 | "弒": "弑",
660 | "弔": "吊",
661 | "弳": "弪",
662 | "張": "张",
663 | "強": "强",
664 | "彃": "𪪼",
665 | "彆": "别",
666 | "彈": "弹",
667 | "彌": "弥",
668 | "彎": "弯",
669 | "彔": "录",
670 | "彙": "汇",
671 | "彞": "彝",
672 | "彠": "彟",
673 | "彥": "彦",
674 | "彫": "雕",
675 | "彲": "彨",
676 | "彷": "彷",
677 | "彿": "佛",
678 | "後": "后",
679 | "徑": "径",
680 | "從": "从",
681 | "徠": "徕",
682 | "復": "复",
683 | "徵": "征",
684 | "徹": "彻",
685 | "徿": "𪫌",
686 | "恆": "恒",
687 | "恥": "耻",
688 | "悅": "悦",
689 | "悞": "悮",
690 | "悵": "怅",
691 | "悶": "闷",
692 | "悽": "凄",
693 | "惡": "恶",
694 | "惱": "恼",
695 | "惲": "恽",
696 | "惻": "恻",
697 | "愛": "爱",
698 | "愜": "惬",
699 | "愨": "悫",
700 | "愴": "怆",
701 | "愷": "恺",
702 | "愻": "𢙏",
703 | "愾": "忾",
704 | "慄": "栗",
705 | "態": "态",
706 | "慍": "愠",
707 | "慘": "惨",
708 | "慚": "惭",
709 | "慟": "恸",
710 | "慣": "惯",
711 | "慤": "悫",
712 | "慪": "怄",
713 | "慫": "怂",
714 | "慮": "虑",
715 | "慳": "悭",
716 | "慶": "庆",
717 | "慺": "㥪",
718 | "慼": "戚",
719 | "慾": "欲",
720 | "憂": "忧",
721 | "憊": "惫",
722 | "憐": "怜",
723 | "憑": "凭",
724 | "憒": "愦",
725 | "憖": "慭",
726 | "憚": "惮",
727 | "憢": "𢙒",
728 | "憤": "愤",
729 | "憫": "悯",
730 | "憮": "怃",
731 | "憲": "宪",
732 | "憶": "忆",
733 | "憸": "𪫺",
734 | "憹": "𢙐",
735 | "懀": "𢙓",
736 | "懇": "恳",
737 | "應": "应",
738 | "懌": "怿",
739 | "懍": "懔",
740 | "懎": "𢠁",
741 | "懞": "蒙",
742 | "懟": "怼",
743 | "懣": "懑",
744 | "懤": "㤽",
745 | "懨": "恹",
746 | "懲": "惩",
747 | "懶": "懒",
748 | "懷": "怀",
749 | "懸": "悬",
750 | "懺": "忏",
751 | "懼": "惧",
752 | "懾": "慑",
753 | "戀": "恋",
754 | "戇": "戆",
755 | "戔": "戋",
756 | "戧": "戗",
757 | "戩": "戬",
758 | "戰": "战",
759 | "戱": "戯",
760 | "戲": "戏",
761 | "戶": "户",
762 | "拋": "抛",
763 | "挩": "捝",
764 | "挱": "挲",
765 | "挾": "挟",
766 | "捨": "舍",
767 | "捫": "扪",
768 | "捱": "挨",
769 | "捲": "卷",
770 | "掃": "扫",
771 | "掄": "抡",
772 | "掆": "㧏",
773 | "掗": "挜",
774 | "掙": "挣",
775 | "掚": "𪭵",
776 | "掛": "挂",
777 | "採": "采",
778 | "揀": "拣",
779 | "揚": "扬",
780 | "換": "换",
781 | "揮": "挥",
782 | "揯": "搄",
783 | "損": "损",
784 | "搖": "摇",
785 | "搗": "捣",
786 | "搵": "揾",
787 | "搶": "抢",
788 | "摋": "𢫬",
789 | "摐": "𪭢",
790 | "摑": "掴",
791 | "摜": "掼",
792 | "摟": "搂",
793 | "摯": "挚",
794 | "摳": "抠",
795 | "摶": "抟",
796 | "摺": "折",
797 | "摻": "掺",
798 | "撈": "捞",
799 | "撊": "𪭾",
800 | "撏": "挦",
801 | "撐": "撑",
802 | "撓": "挠",
803 | "撝": "㧑",
804 | "撟": "挢",
805 | "撣": "掸",
806 | "撥": "拨",
807 | "撧": "𪮖",
808 | "撫": "抚",
809 | "撲": "扑",
810 | "撳": "揿",
811 | "撻": "挞",
812 | "撾": "挝",
813 | "撿": "捡",
814 | "擁": "拥",
815 | "擄": "掳",
816 | "擇": "择",
817 | "擊": "击",
818 | "擋": "挡",
819 | "擓": "㧟",
820 | "擔": "担",
821 | "據": "据",
822 | "擟": "𪭧",
823 | "擠": "挤",
824 | "擡": "抬",
825 | "擣": "捣",
826 | "擫": "𢬍",
827 | "擬": "拟",
828 | "擯": "摈",
829 | "擰": "拧",
830 | "擱": "搁",
831 | "擲": "掷",
832 | "擴": "扩",
833 | "擷": "撷",
834 | "擺": "摆",
835 | "擻": "擞",
836 | "擼": "撸",
837 | "擽": "㧰",
838 | "擾": "扰",
839 | "攄": "摅",
840 | "攆": "撵",
841 | "攋": "𪮶",
842 | "攏": "拢",
843 | "攔": "拦",
844 | "攖": "撄",
845 | "攙": "搀",
846 | "攛": "撺",
847 | "攜": "携",
848 | "攝": "摄",
849 | "攢": "攒",
850 | "攣": "挛",
851 | "攤": "摊",
852 | "攪": "搅",
853 | "攬": "揽",
854 | "敎": "教",
855 | "敓": "敚",
856 | "敗": "败",
857 | "敘": "叙",
858 | "敵": "敌",
859 | "數": "数",
860 | "斂": "敛",
861 | "斃": "毙",
862 | "斅": "𢽾",
863 | "斆": "敩",
864 | "斕": "斓",
865 | "斬": "斩",
866 | "斷": "断",
867 | "斸": "𣃁",
868 | "於": "于",
869 | "旂": "旗",
870 | "旣": "既",
871 | "昇": "升",
872 | "時": "时",
873 | "晉": "晋",
874 | "晝": "昼",
875 | "暈": "晕",
876 | "暉": "晖",
877 | "暘": "旸",
878 | "暢": "畅",
879 | "暫": "暂",
880 | "曄": "晔",
881 | "曆": "历",
882 | "曇": "昙",
883 | "曉": "晓",
884 | "曊": "𪰶",
885 | "曏": "向",
886 | "曖": "暧",
887 | "曠": "旷",
888 | "曥": "𣆐",
889 | "曨": "昽",
890 | "曬": "晒",
891 | "書": "书",
892 | "會": "会",
893 | "朥": "𦛨",
894 | "朧": "胧",
895 | "朮": "术",
896 | "東": "东",
897 | "杴": "锨",
898 | "枴": "拐",
899 | "柵": "栅",
900 | "柺": "拐",
901 | "査": "查",
902 | "桱": "𣐕",
903 | "桿": "杆",
904 | "梔": "栀",
905 | "梖": "𪱷",
906 | "梘": "枧",
907 | "條": "条",
908 | "梟": "枭",
909 | "梲": "棁",
910 | "棄": "弃",
911 | "棊": "棋",
912 | "棖": "枨",
913 | "棗": "枣",
914 | "棟": "栋",
915 | "棡": "㭎",
916 | "棧": "栈",
917 | "棲": "栖",
918 | "棶": "梾",
919 | "椏": "桠",
920 | "椲": "㭏",
921 | "楇": "𣒌",
922 | "楊": "杨",
923 | "楓": "枫",
924 | "楨": "桢",
925 | "業": "业",
926 | "極": "极",
927 | "榘": "矩",
928 | "榦": "干",
929 | "榪": "杩",
930 | "榮": "荣",
931 | "榲": "榅",
932 | "榿": "桤",
933 | "構": "构",
934 | "槍": "枪",
935 | "槓": "杠",
936 | "槤": "梿",
937 | "槧": "椠",
938 | "槨": "椁",
939 | "槫": "𣏢",
940 | "槮": "椮",
941 | "槳": "桨",
942 | "槶": "椢",
943 | "槼": "椝",
944 | "樁": "桩",
945 | "樂": "乐",
946 | "樅": "枞",
947 | "樑": "梁",
948 | "樓": "楼",
949 | "標": "标",
950 | "樞": "枢",
951 | "樠": "𣗊",
952 | "樢": "㭤",
953 | "樣": "样",
954 | "樤": "𣔌",
955 | "樧": "榝",
956 | "樫": "㭴",
957 | "樳": "桪",
958 | "樸": "朴",
959 | "樹": "树",
960 | "樺": "桦",
961 | "樿": "椫",
962 | "橈": "桡",
963 | "橋": "桥",
964 | "機": "机",
965 | "橢": "椭",
966 | "橫": "横",
967 | "橯": "𣓿",
968 | "檁": "檩",
969 | "檉": "柽",
970 | "檔": "档",
971 | "檜": "桧",
972 | "檟": "槚",
973 | "檢": "检",
974 | "檣": "樯",
975 | "檭": "𣘴",
976 | "檮": "梼",
977 | "檯": "台",
978 | "檳": "槟",
979 | "檵": "𪲛",
980 | "檸": "柠",
981 | "檻": "槛",
982 | "檾": "𦼖",
983 | "櫃": "柜",
984 | "櫅": "𪲎",
985 | "櫓": "橹",
986 | "櫚": "榈",
987 | "櫛": "栉",
988 | "櫝": "椟",
989 | "櫞": "橼",
990 | "櫟": "栎",
991 | "櫠": "𪲮",
992 | "櫥": "橱",
993 | "櫧": "槠",
994 | "櫨": "栌",
995 | "櫪": "枥",
996 | "櫫": "橥",
997 | "櫬": "榇",
998 | "櫱": "蘖",
999 | "櫳": "栊",
1000 | "櫸": "榉",
1001 | "櫺": "棂",
1002 | "櫻": "樱",
1003 | "欄": "栏",
1004 | "欅": "榉",
1005 | "欇": "𪳍",
1006 | "權": "权",
1007 | "欍": "𣐤",
1008 | "欏": "椤",
1009 | "欐": "𪲔",
1010 | "欑": "𪴙",
1011 | "欒": "栾",
1012 | "欓": "𣗋",
1013 | "欖": "榄",
1014 | "欘": "𣚚",
1015 | "欞": "棂",
1016 | "欽": "钦",
1017 | "歎": "叹",
1018 | "歐": "欧",
1019 | "歟": "欤",
1020 | "歡": "欢",
1021 | "歲": "岁",
1022 | "歷": "历",
1023 | "歸": "归",
1024 | "歿": "殁",
1025 | "殘": "残",
1026 | "殞": "殒",
1027 | "殢": "𣨼",
1028 | "殤": "殇",
1029 | "殨": "㱮",
1030 | "殫": "殚",
1031 | "殭": "僵",
1032 | "殮": "殓",
1033 | "殯": "殡",
1034 | "殰": "㱩",
1035 | "殲": "歼",
1036 | "殺": "杀",
1037 | "殻": "壳",
1038 | "殼": "壳",
1039 | "毀": "毁",
1040 | "毆": "殴",
1041 | "毊": "𪵑",
1042 | "毿": "毵",
1043 | "氂": "牦",
1044 | "氈": "毡",
1045 | "氌": "氇",
1046 | "氣": "气",
1047 | "氫": "氢",
1048 | "氬": "氩",
1049 | "氭": "𣱝",
1050 | "氳": "氲",
1051 | "氾": "泛",
1052 | "汎": "泛",
1053 | "汙": "污",
1054 | "決": "决",
1055 | "沈": "沈",
1056 | "沒": "没",
1057 | "沖": "冲",
1058 | "況": "况",
1059 | "泝": "溯",
1060 | "洩": "泄",
1061 | "洶": "汹",
1062 | "浹": "浃",
1063 | "涇": "泾",
1064 | "涗": "涚",
1065 | "涼": "凉",
1066 | "淒": "凄",
1067 | "淚": "泪",
1068 | "淥": "渌",
1069 | "淨": "净",
1070 | "淩": "凌",
1071 | "淪": "沦",
1072 | "淵": "渊",
1073 | "淶": "涞",
1074 | "淺": "浅",
1075 | "渙": "涣",
1076 | "減": "减",
1077 | "渢": "沨",
1078 | "渦": "涡",
1079 | "測": "测",
1080 | "渾": "浑",
1081 | "湊": "凑",
1082 | "湋": "𣲗",
1083 | "湞": "浈",
1084 | "湧": "涌",
1085 | "湯": "汤",
1086 | "溈": "沩",
1087 | "準": "准",
1088 | "溝": "沟",
1089 | "溡": "𪶄",
1090 | "溫": "温",
1091 | "溮": "浉",
1092 | "溳": "涢",
1093 | "溼": "湿",
1094 | "滄": "沧",
1095 | "滅": "灭",
1096 | "滌": "涤",
1097 | "滎": "荥",
1098 | "滙": "汇",
1099 | "滬": "沪",
1100 | "滯": "滞",
1101 | "滲": "渗",
1102 | "滷": "卤",
1103 | "滸": "浒",
1104 | "滻": "浐",
1105 | "滾": "滚",
1106 | "滿": "满",
1107 | "漁": "渔",
1108 | "漊": "溇",
1109 | "漚": "沤",
1110 | "漢": "汉",
1111 | "漣": "涟",
1112 | "漬": "渍",
1113 | "漲": "涨",
1114 | "漵": "溆",
1115 | "漸": "渐",
1116 | "漿": "浆",
1117 | "潁": "颍",
1118 | "潑": "泼",
1119 | "潔": "洁",
1120 | "潕": "𣲘",
1121 | "潙": "沩",
1122 | "潚": "㴋",
1123 | "潛": "潜",
1124 | "潣": "𫞗",
1125 | "潤": "润",
1126 | "潯": "浔",
1127 | "潰": "溃",
1128 | "潷": "滗",
1129 | "潿": "涠",
1130 | "澀": "涩",
1131 | "澅": "𣶩",
1132 | "澆": "浇",
1133 | "澇": "涝",
1134 | "澐": "沄",
1135 | "澗": "涧",
1136 | "澠": "渑",
1137 | "澤": "泽",
1138 | "澦": "滪",
1139 | "澩": "泶",
1140 | "澬": "𫞚",
1141 | "澮": "浍",
1142 | "澱": "淀",
1143 | "澾": "㳠",
1144 | "濁": "浊",
1145 | "濃": "浓",
1146 | "濄": "㳡",
1147 | "濆": "𣸣",
1148 | "濕": "湿",
1149 | "濘": "泞",
1150 | "濚": "溁",
1151 | "濛": "蒙",
1152 | "濜": "浕",
1153 | "濟": "济",
1154 | "濤": "涛",
1155 | "濧": "㳔",
1156 | "濫": "滥",
1157 | "濰": "潍",
1158 | "濱": "滨",
1159 | "濺": "溅",
1160 | "濼": "泺",
1161 | "濾": "滤",
1162 | "濿": "𪵱",
1163 | "瀂": "澛",
1164 | "瀃": "𣽷",
1165 | "瀅": "滢",
1166 | "瀆": "渎",
1167 | "瀇": "㲿",
1168 | "瀉": "泻",
1169 | "瀋": "沈",
1170 | "瀏": "浏",
1171 | "瀕": "濒",
1172 | "瀘": "泸",
1173 | "瀝": "沥",
1174 | "瀟": "潇",
1175 | "瀠": "潆",
1176 | "瀦": "潴",
1177 | "瀧": "泷",
1178 | "瀨": "濑",
1179 | "瀰": "弥",
1180 | "瀲": "潋",
1181 | "瀾": "澜",
1182 | "灃": "沣",
1183 | "灄": "滠",
1184 | "灍": "𫞝",
1185 | "灑": "洒",
1186 | "灒": "𪷽",
1187 | "灕": "漓",
1188 | "灘": "滩",
1189 | "灙": "𣺼",
1190 | "灝": "灏",
1191 | "灡": "㳕",
1192 | "灣": "湾",
1193 | "灤": "滦",
1194 | "灧": "滟",
1195 | "灩": "滟",
1196 | "災": "灾",
1197 | "為": "为",
1198 | "烏": "乌",
1199 | "烴": "烃",
1200 | "無": "无",
1201 | "煇": "𪸩",
1202 | "煉": "炼",
1203 | "煒": "炜",
1204 | "煙": "烟",
1205 | "煢": "茕",
1206 | "煥": "焕",
1207 | "煩": "烦",
1208 | "煬": "炀",
1209 | "煱": "㶽",
1210 | "熂": "𪸕",
1211 | "熅": "煴",
1212 | "熉": "𤈶",
1213 | "熌": "𤇄",
1214 | "熒": "荧",
1215 | "熓": "𤆡",
1216 | "熗": "炝",
1217 | "熚": "𤇹",
1218 | "熡": "𤋏",
1219 | "熱": "热",
1220 | "熲": "颎",
1221 | "熾": "炽",
1222 | "燁": "烨",
1223 | "燈": "灯",
1224 | "燉": "炖",
1225 | "燒": "烧",
1226 | "燙": "烫",
1227 | "燜": "焖",
1228 | "營": "营",
1229 | "燦": "灿",
1230 | "燬": "毁",
1231 | "燭": "烛",
1232 | "燴": "烩",
1233 | "燶": "㶶",
1234 | "燻": "熏",
1235 | "燼": "烬",
1236 | "燾": "焘",
1237 | "爃": "𫞡",
1238 | "爄": "𤇃",
1239 | "爇": "𦶟",
1240 | "爍": "烁",
1241 | "爐": "炉",
1242 | "爖": "𤇭",
1243 | "爛": "烂",
1244 | "爥": "𪹳",
1245 | "爧": "𫞠",
1246 | "爭": "争",
1247 | "爲": "为",
1248 | "爺": "爷",
1249 | "爾": "尔",
1250 | "牀": "床",
1251 | "牆": "墙",
1252 | "牘": "牍",
1253 | "牴": "牴",
1254 | "牽": "牵",
1255 | "犖": "荦",
1256 | "犛": "牦",
1257 | "犞": "𪺭",
1258 | "犢": "犊",
1259 | "犧": "牺",
1260 | "狀": "状",
1261 | "狹": "狭",
1262 | "狽": "狈",
1263 | "猌": "𪺽",
1264 | "猙": "狰",
1265 | "猶": "犹",
1266 | "猻": "狲",
1267 | "獁": "犸",
1268 | "獃": "呆",
1269 | "獄": "狱",
1270 | "獅": "狮",
1271 | "獊": "𪺷",
1272 | "獎": "奖",
1273 | "獨": "独",
1274 | "獩": "𤞃",
1275 | "獪": "狯",
1276 | "獫": "猃",
1277 | "獮": "狝",
1278 | "獰": "狞",
1279 | "獱": "㺍",
1280 | "獲": "获",
1281 | "獵": "猎",
1282 | "獷": "犷",
1283 | "獸": "兽",
1284 | "獺": "獭",
1285 | "獻": "献",
1286 | "獼": "猕",
1287 | "玀": "猡",
1288 | "玁": "𤞤",
1289 | "珼": "𫞥",
1290 | "現": "现",
1291 | "琱": "雕",
1292 | "琺": "珐",
1293 | "琿": "珲",
1294 | "瑋": "玮",
1295 | "瑒": "玚",
1296 | "瑣": "琐",
1297 | "瑤": "瑶",
1298 | "瑩": "莹",
1299 | "瑪": "玛",
1300 | "瑲": "玱",
1301 | "瑻": "𪻲",
1302 | "瑽": "𪻐",
1303 | "璉": "琏",
1304 | "璊": "𫞩",
1305 | "璝": "𪻺",
1306 | "璡": "琎",
1307 | "璣": "玑",
1308 | "璦": "瑷",
1309 | "璫": "珰",
1310 | "璯": "㻅",
1311 | "環": "环",
1312 | "璵": "玙",
1313 | "璸": "瑸",
1314 | "璼": "𫞨",
1315 | "璽": "玺",
1316 | "璾": "𫞦",
1317 | "瓄": "𪻨",
1318 | "瓊": "琼",
1319 | "瓏": "珑",
1320 | "瓔": "璎",
1321 | "瓕": "𤦀",
1322 | "瓚": "瓒",
1323 | "瓛": "𤩽",
1324 | "甌": "瓯",
1325 | "甕": "瓮",
1326 | "產": "产",
1327 | "産": "产",
1328 | "甦": "苏",
1329 | "甯": "宁",
1330 | "畝": "亩",
1331 | "畢": "毕",
1332 | "畫": "画",
1333 | "異": "异",
1334 | "畵": "画",
1335 | "當": "当",
1336 | "畼": "𪽈",
1337 | "疇": "畴",
1338 | "疊": "叠",
1339 | "痙": "痉",
1340 | "痠": "酸",
1341 | "痮": "𪽪",
1342 | "痾": "疴",
1343 | "瘂": "痖",
1344 | "瘋": "疯",
1345 | "瘍": "疡",
1346 | "瘓": "痪",
1347 | "瘞": "瘗",
1348 | "瘡": "疮",
1349 | "瘧": "疟",
1350 | "瘮": "瘆",
1351 | "瘱": "𪽷",
1352 | "瘲": "疭",
1353 | "瘺": "瘘",
1354 | "瘻": "瘘",
1355 | "療": "疗",
1356 | "癆": "痨",
1357 | "癇": "痫",
1358 | "癉": "瘅",
1359 | "癐": "𤶊",
1360 | "癒": "愈",
1361 | "癘": "疠",
1362 | "癟": "瘪",
1363 | "癡": "痴",
1364 | "癢": "痒",
1365 | "癤": "疖",
1366 | "癥": "症",
1367 | "癧": "疬",
1368 | "癩": "癞",
1369 | "癬": "癣",
1370 | "癭": "瘿",
1371 | "癮": "瘾",
1372 | "癰": "痈",
1373 | "癱": "瘫",
1374 | "癲": "癫",
1375 | "發": "发",
1376 | "皁": "皂",
1377 | "皚": "皑",
1378 | "皟": "𤾀",
1379 | "皰": "疱",
1380 | "皸": "皲",
1381 | "皺": "皱",
1382 | "盃": "杯",
1383 | "盜": "盗",
1384 | "盞": "盏",
1385 | "盡": "尽",
1386 | "監": "监",
1387 | "盤": "盘",
1388 | "盧": "卢",
1389 | "盨": "𪾔",
1390 | "盪": "荡",
1391 | "眝": "𪾣",
1392 | "眞": "真",
1393 | "眥": "眦",
1394 | "眾": "众",
1395 | "睍": "𪾢",
1396 | "睏": "困",
1397 | "睜": "睁",
1398 | "睞": "睐",
1399 | "睪": "睾",
1400 | "瞘": "眍",
1401 | "瞜": "䁖",
1402 | "瞞": "瞒",
1403 | "瞤": "𥆧",
1404 | "瞭": "瞭",
1405 | "瞶": "瞆",
1406 | "瞼": "睑",
1407 | "矇": "蒙",
1408 | "矉": "𪾸",
1409 | "矑": "𪾦",
1410 | "矓": "眬",
1411 | "矚": "瞩",
1412 | "矯": "矫",
1413 | "硃": "朱",
1414 | "硜": "硁",
1415 | "硤": "硖",
1416 | "硨": "砗",
1417 | "硯": "砚",
1418 | "碕": "埼",
1419 | "碙": "𥐻",
1420 | "碩": "硕",
1421 | "碭": "砀",
1422 | "碸": "砜",
1423 | "確": "确",
1424 | "碼": "码",
1425 | "碽": "䂵",
1426 | "磑": "硙",
1427 | "磚": "砖",
1428 | "磠": "硵",
1429 | "磣": "碜",
1430 | "磧": "碛",
1431 | "磯": "矶",
1432 | "磽": "硗",
1433 | "磾": "䃅",
1434 | "礄": "硚",
1435 | "礆": "硷",
1436 | "礎": "础",
1437 | "礒": "𥐟",
1438 | "礙": "碍",
1439 | "礦": "矿",
1440 | "礪": "砺",
1441 | "礫": "砾",
1442 | "礬": "矾",
1443 | "礮": "𪿫",
1444 | "礱": "砻",
1445 | "祇": "祇",
1446 | "祕": "秘",
1447 | "祿": "禄",
1448 | "禍": "祸",
1449 | "禎": "祯",
1450 | "禕": "祎",
1451 | "禡": "祃",
1452 | "禦": "御",
1453 | "禪": "禅",
1454 | "禮": "礼",
1455 | "禰": "祢",
1456 | "禱": "祷",
1457 | "禿": "秃",
1458 | "秈": "籼",
1459 | "稅": "税",
1460 | "稈": "秆",
1461 | "稏": "䅉",
1462 | "稜": "棱",
1463 | "稟": "禀",
1464 | "種": "种",
1465 | "稱": "称",
1466 | "穀": "谷",
1467 | "穇": "䅟",
1468 | "穌": "稣",
1469 | "積": "积",
1470 | "穎": "颖",
1471 | "穠": "秾",
1472 | "穡": "穑",
1473 | "穢": "秽",
1474 | "穩": "稳",
1475 | "穫": "获",
1476 | "穭": "穞",
1477 | "窩": "窝",
1478 | "窪": "洼",
1479 | "窮": "穷",
1480 | "窯": "窑",
1481 | "窵": "窎",
1482 | "窶": "窭",
1483 | "窺": "窥",
1484 | "竄": "窜",
1485 | "竅": "窍",
1486 | "竇": "窦",
1487 | "竈": "灶",
1488 | "竊": "窃",
1489 | "竚": "𥩟",
1490 | "竪": "竖",
1491 | "竱": "𫁟",
1492 | "競": "竞",
1493 | "筆": "笔",
1494 | "筍": "笋",
1495 | "筧": "笕",
1496 | "筴": "䇲",
1497 | "箇": "个",
1498 | "箋": "笺",
1499 | "箏": "筝",
1500 | "節": "节",
1501 | "範": "范",
1502 | "築": "筑",
1503 | "篋": "箧",
1504 | "篔": "筼",
1505 | "篘": "𥬠",
1506 | "篠": "筿",
1507 | "篤": "笃",
1508 | "篩": "筛",
1509 | "篳": "筚",
1510 | "篸": "𥮾",
1511 | "簀": "箦",
1512 | "簂": "𫂆",
1513 | "簍": "篓",
1514 | "簑": "蓑",
1515 | "簞": "箪",
1516 | "簡": "简",
1517 | "簢": "𫂃",
1518 | "簣": "篑",
1519 | "簫": "箫",
1520 | "簹": "筜",
1521 | "簽": "签",
1522 | "簾": "帘",
1523 | "籃": "篮",
1524 | "籅": "𥫣",
1525 | "籋": "𥬞",
1526 | "籌": "筹",
1527 | "籔": "䉤",
1528 | "籙": "箓",
1529 | "籛": "篯",
1530 | "籜": "箨",
1531 | "籟": "籁",
1532 | "籠": "笼",
1533 | "籤": "签",
1534 | "籩": "笾",
1535 | "籪": "簖",
1536 | "籬": "篱",
1537 | "籮": "箩",
1538 | "籲": "吁",
1539 | "粵": "粤",
1540 | "糉": "粽",
1541 | "糝": "糁",
1542 | "糞": "粪",
1543 | "糧": "粮",
1544 | "糰": "团",
1545 | "糲": "粝",
1546 | "糴": "籴",
1547 | "糶": "粜",
1548 | "糹": "纟",
1549 | "糺": "𫄙",
1550 | "糾": "纠",
1551 | "紀": "纪",
1552 | "紂": "纣",
1553 | "約": "约",
1554 | "紅": "红",
1555 | "紆": "纡",
1556 | "紇": "纥",
1557 | "紈": "纨",
1558 | "紉": "纫",
1559 | "紋": "纹",
1560 | "納": "纳",
1561 | "紐": "纽",
1562 | "紓": "纾",
1563 | "純": "纯",
1564 | "紕": "纰",
1565 | "紖": "纼",
1566 | "紗": "纱",
1567 | "紘": "纮",
1568 | "紙": "纸",
1569 | "級": "级",
1570 | "紛": "纷",
1571 | "紜": "纭",
1572 | "紝": "纴",
1573 | "紟": "𫄛",
1574 | "紡": "纺",
1575 | "紬": "䌷",
1576 | "紮": "扎",
1577 | "細": "细",
1578 | "紱": "绂",
1579 | "紲": "绁",
1580 | "紳": "绅",
1581 | "紵": "纻",
1582 | "紹": "绍",
1583 | "紺": "绀",
1584 | "紼": "绋",
1585 | "紿": "绐",
1586 | "絀": "绌",
1587 | "絁": "𫄟",
1588 | "終": "终",
1589 | "絃": "弦",
1590 | "組": "组",
1591 | "絅": "䌹",
1592 | "絆": "绊",
1593 | "絍": "𫟃",
1594 | "絎": "绗",
1595 | "結": "结",
1596 | "絕": "绝",
1597 | "絙": "𫄠",
1598 | "絛": "绦",
1599 | "絝": "绔",
1600 | "絞": "绞",
1601 | "絡": "络",
1602 | "絢": "绚",
1603 | "絥": "𫄢",
1604 | "給": "给",
1605 | "絧": "𫄡",
1606 | "絨": "绒",
1607 | "絰": "绖",
1608 | "統": "统",
1609 | "絲": "丝",
1610 | "絳": "绛",
1611 | "絶": "绝",
1612 | "絹": "绢",
1613 | "絺": "𫄨",
1614 | "綀": "𦈌",
1615 | "綁": "绑",
1616 | "綃": "绡",
1617 | "綆": "绠",
1618 | "綇": "𦈋",
1619 | "綈": "绨",
1620 | "綉": "绣",
1621 | "綋": "𫟄",
1622 | "綌": "绤",
1623 | "綏": "绥",
1624 | "綐": "䌼",
1625 | "綑": "捆",
1626 | "經": "经",
1627 | "綖": "𫄧",
1628 | "綜": "综",
1629 | "綞": "缍",
1630 | "綟": "𫄫",
1631 | "綠": "绿",
1632 | "綡": "𫟅",
1633 | "綢": "绸",
1634 | "綣": "绻",
1635 | "綫": "线",
1636 | "綬": "绶",
1637 | "維": "维",
1638 | "綯": "绹",
1639 | "綰": "绾",
1640 | "綱": "纲",
1641 | "網": "网",
1642 | "綳": "绷",
1643 | "綴": "缀",
1644 | "綵": "彩",
1645 | "綸": "纶",
1646 | "綹": "绺",
1647 | "綺": "绮",
1648 | "綻": "绽",
1649 | "綽": "绰",
1650 | "綾": "绫",
1651 | "綿": "绵",
1652 | "緄": "绲",
1653 | "緇": "缁",
1654 | "緊": "紧",
1655 | "緋": "绯",
1656 | "緍": "𦈏",
1657 | "緑": "绿",
1658 | "緒": "绪",
1659 | "緓": "绬",
1660 | "緔": "绱",
1661 | "緗": "缃",
1662 | "緘": "缄",
1663 | "緙": "缂",
1664 | "線": "线",
1665 | "緝": "缉",
1666 | "緞": "缎",
1667 | "緟": "𫟆",
1668 | "締": "缔",
1669 | "緡": "缗",
1670 | "緣": "缘",
1671 | "緤": "𫄬",
1672 | "緦": "缌",
1673 | "編": "编",
1674 | "緩": "缓",
1675 | "緬": "缅",
1676 | "緮": "𫄭",
1677 | "緯": "纬",
1678 | "緰": "𦈕",
1679 | "緱": "缑",
1680 | "緲": "缈",
1681 | "練": "练",
1682 | "緶": "缏",
1683 | "緷": "𦈉",
1684 | "緸": "𦈑",
1685 | "緹": "缇",
1686 | "緻": "致",
1687 | "緼": "缊",
1688 | "縈": "萦",
1689 | "縉": "缙",
1690 | "縊": "缢",
1691 | "縋": "缒",
1692 | "縍": "𫄰",
1693 | "縎": "𦈔",
1694 | "縐": "绉",
1695 | "縑": "缣",
1696 | "縕": "缊",
1697 | "縗": "缞",
1698 | "縛": "缚",
1699 | "縝": "缜",
1700 | "縞": "缟",
1701 | "縟": "缛",
1702 | "縣": "县",
1703 | "縧": "绦",
1704 | "縫": "缝",
1705 | "縬": "𦈚",
1706 | "縭": "缡",
1707 | "縮": "缩",
1708 | "縰": "𫄳",
1709 | "縱": "纵",
1710 | "縲": "缧",
1711 | "縳": "䌸",
1712 | "縴": "纤",
1713 | "縵": "缦",
1714 | "縶": "絷",
1715 | "縷": "缕",
1716 | "縸": "𫄲",
1717 | "縹": "缥",
1718 | "縺": "𦈐",
1719 | "總": "总",
1720 | "績": "绩",
1721 | "繂": "𫄴",
1722 | "繃": "绷",
1723 | "繅": "缫",
1724 | "繆": "缪",
1725 | "繈": "𫄶",
1726 | "繏": "𦈝",
1727 | "繐": "穗",
1728 | "繒": "缯",
1729 | "繓": "𦈛",
1730 | "織": "织",
1731 | "繕": "缮",
1732 | "繚": "缭",
1733 | "繞": "绕",
1734 | "繟": "𦈎",
1735 | "繡": "绣",
1736 | "繢": "缋",
1737 | "繨": "𫄤",
1738 | "繩": "绳",
1739 | "繪": "绘",
1740 | "繫": "系",
1741 | "繬": "𫄱",
1742 | "繭": "茧",
1743 | "繮": "缰",
1744 | "繯": "缳",
1745 | "繰": "缲",
1746 | "繳": "缴",
1747 | "繶": "𫄷",
1748 | "繷": "𫄣",
1749 | "繸": "䍁",
1750 | "繹": "绎",
1751 | "繻": "𦈡",
1752 | "繼": "继",
1753 | "繽": "缤",
1754 | "繾": "缱",
1755 | "繿": "䍀",
1756 | "纁": "𫄸",
1757 | "纇": "颣",
1758 | "纈": "缬",
1759 | "纊": "纩",
1760 | "續": "续",
1761 | "纍": "累",
1762 | "纏": "缠",
1763 | "纓": "缨",
1764 | "纔": "才",
1765 | "纖": "纤",
1766 | "纗": "𫄹",
1767 | "纘": "缵",
1768 | "纚": "𫄥",
1769 | "纜": "缆",
1770 | "缽": "钵",
1771 | "罃": "䓨",
1772 | "罈": "坛",
1773 | "罌": "罂",
1774 | "罎": "坛",
1775 | "罰": "罚",
1776 | "罵": "骂",
1777 | "罷": "罢",
1778 | "羅": "罗",
1779 | "羆": "罴",
1780 | "羈": "羁",
1781 | "羋": "芈",
1782 | "羣": "群",
1783 | "羥": "羟",
1784 | "羨": "羡",
1785 | "義": "义",
1786 | "羵": "𫅗",
1787 | "羶": "膻",
1788 | "習": "习",
1789 | "翬": "翚",
1790 | "翹": "翘",
1791 | "翽": "翙",
1792 | "耬": "耧",
1793 | "耮": "耢",
1794 | "聖": "圣",
1795 | "聞": "闻",
1796 | "聯": "联",
1797 | "聰": "聪",
1798 | "聲": "声",
1799 | "聳": "耸",
1800 | "聵": "聩",
1801 | "聶": "聂",
1802 | "職": "职",
1803 | "聹": "聍",
1804 | "聻": "𫆏",
1805 | "聽": "听",
1806 | "聾": "聋",
1807 | "肅": "肃",
1808 | "脅": "胁",
1809 | "脈": "脉",
1810 | "脛": "胫",
1811 | "脣": "唇",
1812 | "脥": "𣍰",
1813 | "脩": "修",
1814 | "脫": "脱",
1815 | "脹": "胀",
1816 | "腎": "肾",
1817 | "腖": "胨",
1818 | "腡": "脶",
1819 | "腦": "脑",
1820 | "腪": "𣍯",
1821 | "腫": "肿",
1822 | "腳": "脚",
1823 | "腸": "肠",
1824 | "膃": "腽",
1825 | "膕": "腘",
1826 | "膚": "肤",
1827 | "膞": "䏝",
1828 | "膠": "胶",
1829 | "膢": "𦝼",
1830 | "膩": "腻",
1831 | "膹": "𪱥",
1832 | "膽": "胆",
1833 | "膾": "脍",
1834 | "膿": "脓",
1835 | "臉": "脸",
1836 | "臍": "脐",
1837 | "臏": "膑",
1838 | "臗": "𣎑",
1839 | "臘": "腊",
1840 | "臚": "胪",
1841 | "臟": "脏",
1842 | "臠": "脔",
1843 | "臢": "臜",
1844 | "臥": "卧",
1845 | "臨": "临",
1846 | "臺": "台",
1847 | "與": "与",
1848 | "興": "兴",
1849 | "舉": "举",
1850 | "舊": "旧",
1851 | "舘": "馆",
1852 | "艙": "舱",
1853 | "艣": "𫇛",
1854 | "艤": "舣",
1855 | "艦": "舰",
1856 | "艫": "舻",
1857 | "艱": "艰",
1858 | "艷": "艳",
1859 | "芻": "刍",
1860 | "苧": "苎",
1861 | "茲": "兹",
1862 | "荊": "荆",
1863 | "莊": "庄",
1864 | "莖": "茎",
1865 | "莢": "荚",
1866 | "莧": "苋",
1867 | "菕": "芲",
1868 | "華": "华",
1869 | "菴": "庵",
1870 | "菸": "烟",
1871 | "萇": "苌",
1872 | "萊": "莱",
1873 | "萬": "万",
1874 | "萴": "荝",
1875 | "萵": "莴",
1876 | "葉": "叶",
1877 | "葒": "荭",
1878 | "葝": "𫈎",
1879 | "葤": "荮",
1880 | "葦": "苇",
1881 | "葯": "药",
1882 | "葷": "荤",
1883 | "蒍": "𫇭",
1884 | "蒐": "搜",
1885 | "蒓": "莼",
1886 | "蒔": "莳",
1887 | "蒕": "蒀",
1888 | "蒞": "莅",
1889 | "蒭": "𫇴",
1890 | "蒼": "苍",
1891 | "蓀": "荪",
1892 | "蓆": "席",
1893 | "蓋": "盖",
1894 | "蓧": "𦰏",
1895 | "蓮": "莲",
1896 | "蓯": "苁",
1897 | "蓴": "莼",
1898 | "蓽": "荜",
1899 | "蔔": "卜",
1900 | "蔘": "参",
1901 | "蔞": "蒌",
1902 | "蔣": "蒋",
1903 | "蔥": "葱",
1904 | "蔦": "茑",
1905 | "蔭": "荫",
1906 | "蔯": "𫈟",
1907 | "蔿": "𫇭",
1908 | "蕁": "荨",
1909 | "蕆": "蒇",
1910 | "蕎": "荞",
1911 | "蕒": "荬",
1912 | "蕓": "芸",
1913 | "蕕": "莸",
1914 | "蕘": "荛",
1915 | "蕝": "𫈵",
1916 | "蕢": "蒉",
1917 | "蕩": "荡",
1918 | "蕪": "芜",
1919 | "蕭": "萧",
1920 | "蕳": "𫈉",
1921 | "蕷": "蓣",
1922 | "蕽": "𫇽",
1923 | "薀": "蕰",
1924 | "薆": "𫉁",
1925 | "薈": "荟",
1926 | "薊": "蓟",
1927 | "薌": "芗",
1928 | "薑": "姜",
1929 | "薔": "蔷",
1930 | "薘": "荙",
1931 | "薟": "莶",
1932 | "薦": "荐",
1933 | "薩": "萨",
1934 | "薰": "薰",
1935 | "薳": "䓕",
1936 | "薴": "苧",
1937 | "薵": "䓓",
1938 | "薹": "苔",
1939 | "薺": "荠",
1940 | "藉": "藉",
1941 | "藍": "蓝",
1942 | "藎": "荩",
1943 | "藝": "艺",
1944 | "藥": "药",
1945 | "藪": "薮",
1946 | "藭": "䓖",
1947 | "藴": "蕴",
1948 | "藶": "苈",
1949 | "藷": "𫉄",
1950 | "藹": "蔼",
1951 | "藺": "蔺",
1952 | "蘀": "萚",
1953 | "蘄": "蕲",
1954 | "蘆": "芦",
1955 | "蘇": "苏",
1956 | "蘊": "蕴",
1957 | "蘋": "苹",
1958 | "蘚": "藓",
1959 | "蘞": "蔹",
1960 | "蘟": "𦻕",
1961 | "蘢": "茏",
1962 | "蘭": "兰",
1963 | "蘺": "蓠",
1964 | "蘿": "萝",
1965 | "虆": "蔂",
1966 | "處": "处",
1967 | "虛": "虚",
1968 | "虜": "虏",
1969 | "號": "号",
1970 | "虧": "亏",
1971 | "虯": "虬",
1972 | "蛺": "蛱",
1973 | "蛻": "蜕",
1974 | "蜆": "蚬",
1975 | "蝕": "蚀",
1976 | "蝟": "猬",
1977 | "蝦": "虾",
1978 | "蝨": "虱",
1979 | "蝸": "蜗",
1980 | "螄": "蛳",
1981 | "螞": "蚂",
1982 | "螢": "萤",
1983 | "螮": "䗖",
1984 | "螻": "蝼",
1985 | "螿": "螀",
1986 | "蟂": "𫋇",
1987 | "蟄": "蛰",
1988 | "蟈": "蝈",
1989 | "蟎": "螨",
1990 | "蟘": "𫋌",
1991 | "蟜": "𫊸",
1992 | "蟣": "虮",
1993 | "蟬": "蝉",
1994 | "蟯": "蛲",
1995 | "蟲": "虫",
1996 | "蟳": "𫊻",
1997 | "蟶": "蛏",
1998 | "蟻": "蚁",
1999 | "蠀": "𧏗",
2000 | "蠁": "蚃",
2001 | "蠅": "蝇",
2002 | "蠆": "虿",
2003 | "蠍": "蝎",
2004 | "蠐": "蛴",
2005 | "蠑": "蝾",
2006 | "蠔": "蚝",
2007 | "蠙": "𧏖",
2008 | "蠟": "蜡",
2009 | "蠣": "蛎",
2010 | "蠦": "𫊮",
2011 | "蠨": "蟏",
2012 | "蠱": "蛊",
2013 | "蠶": "蚕",
2014 | "蠻": "蛮",
2015 | "蠾": "𧑏",
2016 | "衆": "众",
2017 | "衊": "蔑",
2018 | "術": "术",
2019 | "衕": "同",
2020 | "衚": "胡",
2021 | "衛": "卫",
2022 | "衝": "冲",
2023 | "衹": "衹",
2024 | "袞": "衮",
2025 | "裊": "袅",
2026 | "裏": "里",
2027 | "補": "补",
2028 | "裝": "装",
2029 | "裡": "里",
2030 | "製": "制",
2031 | "複": "复",
2032 | "褌": "裈",
2033 | "褘": "袆",
2034 | "褲": "裤",
2035 | "褳": "裢",
2036 | "褸": "褛",
2037 | "褻": "亵",
2038 | "襀": "𫌀",
2039 | "襆": "幞",
2040 | "襇": "裥",
2041 | "襉": "裥",
2042 | "襏": "袯",
2043 | "襓": "𫋹",
2044 | "襖": "袄",
2045 | "襗": "𫋷",
2046 | "襘": "𫋻",
2047 | "襝": "裣",
2048 | "襠": "裆",
2049 | "襤": "褴",
2050 | "襪": "袜",
2051 | "襬": "摆",
2052 | "襯": "衬",
2053 | "襰": "𧝝",
2054 | "襲": "袭",
2055 | "襴": "襕",
2056 | "襵": "𫌇",
2057 | "覆": "覆",
2058 | "覈": "核",
2059 | "見": "见",
2060 | "覎": "觃",
2061 | "規": "规",
2062 | "覓": "觅",
2063 | "視": "视",
2064 | "覘": "觇",
2065 | "覛": "𫌪",
2066 | "覡": "觋",
2067 | "覥": "觍",
2068 | "覦": "觎",
2069 | "親": "亲",
2070 | "覬": "觊",
2071 | "覯": "觏",
2072 | "覲": "觐",
2073 | "覷": "觑",
2074 | "覹": "𫌭",
2075 | "覺": "觉",
2076 | "覼": "𫌨",
2077 | "覽": "览",
2078 | "覿": "觌",
2079 | "觀": "观",
2080 | "觴": "觞",
2081 | "觶": "觯",
2082 | "觸": "触",
2083 | "訁": "讠",
2084 | "訂": "订",
2085 | "訃": "讣",
2086 | "計": "计",
2087 | "訊": "讯",
2088 | "訌": "讧",
2089 | "討": "讨",
2090 | "訐": "讦",
2091 | "訑": "𫍙",
2092 | "訒": "讱",
2093 | "訓": "训",
2094 | "訕": "讪",
2095 | "訖": "讫",
2096 | "託": "托",
2097 | "記": "记",
2098 | "訛": "讹",
2099 | "訜": "𫍛",
2100 | "訝": "讶",
2101 | "訞": "𫍚",
2102 | "訟": "讼",
2103 | "訢": "䜣",
2104 | "訣": "诀",
2105 | "訥": "讷",
2106 | "訨": "𫟞",
2107 | "訩": "讻",
2108 | "訪": "访",
2109 | "設": "设",
2110 | "許": "许",
2111 | "訴": "诉",
2112 | "訶": "诃",
2113 | "診": "诊",
2114 | "註": "注",
2115 | "証": "证",
2116 | "詀": "𧮪",
2117 | "詁": "诂",
2118 | "詆": "诋",
2119 | "詊": "𫟟",
2120 | "詎": "讵",
2121 | "詐": "诈",
2122 | "詑": "𫍡",
2123 | "詒": "诒",
2124 | "詓": "𫍜",
2125 | "詔": "诏",
2126 | "評": "评",
2127 | "詖": "诐",
2128 | "詗": "诇",
2129 | "詘": "诎",
2130 | "詛": "诅",
2131 | "詞": "词",
2132 | "詠": "咏",
2133 | "詡": "诩",
2134 | "詢": "询",
2135 | "詣": "诣",
2136 | "試": "试",
2137 | "詩": "诗",
2138 | "詫": "诧",
2139 | "詬": "诟",
2140 | "詭": "诡",
2141 | "詮": "诠",
2142 | "詰": "诘",
2143 | "話": "话",
2144 | "該": "该",
2145 | "詳": "详",
2146 | "詵": "诜",
2147 | "詷": "𫍣",
2148 | "詼": "诙",
2149 | "詿": "诖",
2150 | "誂": "𫍥",
2151 | "誄": "诔",
2152 | "誅": "诛",
2153 | "誆": "诓",
2154 | "誇": "夸",
2155 | "誋": "𫍪",
2156 | "誌": "志",
2157 | "認": "认",
2158 | "誑": "诳",
2159 | "誒": "诶",
2160 | "誕": "诞",
2161 | "誘": "诱",
2162 | "誚": "诮",
2163 | "語": "语",
2164 | "誠": "诚",
2165 | "誡": "诫",
2166 | "誣": "诬",
2167 | "誤": "误",
2168 | "誥": "诰",
2169 | "誦": "诵",
2170 | "誨": "诲",
2171 | "說": "说",
2172 | "誫": "𫍨",
2173 | "説": "说",
2174 | "誰": "谁",
2175 | "課": "课",
2176 | "誳": "𫍮",
2177 | "誴": "𫟡",
2178 | "誶": "谇",
2179 | "誷": "𫍬",
2180 | "誹": "诽",
2181 | "誺": "𫍧",
2182 | "誼": "谊",
2183 | "誾": "訚",
2184 | "調": "调",
2185 | "諂": "谄",
2186 | "諄": "谆",
2187 | "談": "谈",
2188 | "諉": "诿",
2189 | "請": "请",
2190 | "諍": "诤",
2191 | "諏": "诹",
2192 | "諑": "诼",
2193 | "諒": "谅",
2194 | "論": "论",
2195 | "諗": "谂",
2196 | "諛": "谀",
2197 | "諜": "谍",
2198 | "諝": "谞",
2199 | "諞": "谝",
2200 | "諡": "谥",
2201 | "諢": "诨",
2202 | "諣": "𫍩",
2203 | "諤": "谔",
2204 | "諥": "𫍳",
2205 | "諦": "谛",
2206 | "諧": "谐",
2207 | "諫": "谏",
2208 | "諭": "谕",
2209 | "諮": "咨",
2210 | "諯": "𫍱",
2211 | "諰": "𫍰",
2212 | "諱": "讳",
2213 | "諳": "谙",
2214 | "諴": "𫍯",
2215 | "諶": "谌",
2216 | "諷": "讽",
2217 | "諸": "诸",
2218 | "諺": "谚",
2219 | "諼": "谖",
2220 | "諾": "诺",
2221 | "謀": "谋",
2222 | "謁": "谒",
2223 | "謂": "谓",
2224 | "謄": "誊",
2225 | "謅": "诌",
2226 | "謆": "𫍸",
2227 | "謉": "𫍷",
2228 | "謊": "谎",
2229 | "謎": "谜",
2230 | "謏": "𫍲",
2231 | "謐": "谧",
2232 | "謔": "谑",
2233 | "謖": "谡",
2234 | "謗": "谤",
2235 | "謙": "谦",
2236 | "謚": "谥",
2237 | "講": "讲",
2238 | "謝": "谢",
2239 | "謠": "谣",
2240 | "謡": "谣",
2241 | "謨": "谟",
2242 | "謫": "谪",
2243 | "謬": "谬",
2244 | "謭": "谫",
2245 | "謯": "𫍹",
2246 | "謱": "𫍴",
2247 | "謳": "讴",
2248 | "謸": "𫍵",
2249 | "謹": "谨",
2250 | "謾": "谩",
2251 | "譁": "哗",
2252 | "譂": "𫟠",
2253 | "譅": "䜧",
2254 | "譆": "𫍻",
2255 | "證": "证",
2256 | "譊": "𫍢",
2257 | "譎": "谲",
2258 | "譏": "讥",
2259 | "譑": "𫍤",
2260 | "譖": "谮",
2261 | "識": "识",
2262 | "譙": "谯",
2263 | "譚": "谭",
2264 | "譜": "谱",
2265 | "譞": "𫍽",
2266 | "譟": "噪",
2267 | "譨": "𫍦",
2268 | "譫": "谵",
2269 | "譭": "毁",
2270 | "譯": "译",
2271 | "議": "议",
2272 | "譴": "谴",
2273 | "護": "护",
2274 | "譸": "诪",
2275 | "譽": "誉",
2276 | "譾": "谫",
2277 | "讀": "读",
2278 | "讅": "谉",
2279 | "變": "变",
2280 | "讋": "詟",
2281 | "讌": "䜩",
2282 | "讎": "雠",
2283 | "讒": "谗",
2284 | "讓": "让",
2285 | "讕": "谰",
2286 | "讖": "谶",
2287 | "讚": "赞",
2288 | "讜": "谠",
2289 | "讞": "谳",
2290 | "豈": "岂",
2291 | "豎": "竖",
2292 | "豐": "丰",
2293 | "豔": "艳",
2294 | "豬": "猪",
2295 | "豵": "𫎆",
2296 | "豶": "豮",
2297 | "貓": "猫",
2298 | "貗": "𫎌",
2299 | "貙": "䝙",
2300 | "貝": "贝",
2301 | "貞": "贞",
2302 | "貟": "贠",
2303 | "負": "负",
2304 | "財": "财",
2305 | "貢": "贡",
2306 | "貧": "贫",
2307 | "貨": "货",
2308 | "販": "贩",
2309 | "貪": "贪",
2310 | "貫": "贯",
2311 | "責": "责",
2312 | "貯": "贮",
2313 | "貰": "贳",
2314 | "貲": "赀",
2315 | "貳": "贰",
2316 | "貴": "贵",
2317 | "貶": "贬",
2318 | "買": "买",
2319 | "貸": "贷",
2320 | "貺": "贶",
2321 | "費": "费",
2322 | "貼": "贴",
2323 | "貽": "贻",
2324 | "貿": "贸",
2325 | "賀": "贺",
2326 | "賁": "贲",
2327 | "賂": "赂",
2328 | "賃": "赁",
2329 | "賄": "贿",
2330 | "賅": "赅",
2331 | "資": "资",
2332 | "賈": "贾",
2333 | "賊": "贼",
2334 | "賑": "赈",
2335 | "賒": "赊",
2336 | "賓": "宾",
2337 | "賕": "赇",
2338 | "賙": "赒",
2339 | "賚": "赉",
2340 | "賜": "赐",
2341 | "賝": "𫎩",
2342 | "賞": "赏",
2343 | "賟": "𧹖",
2344 | "賠": "赔",
2345 | "賡": "赓",
2346 | "賢": "贤",
2347 | "賣": "卖",
2348 | "賤": "贱",
2349 | "賦": "赋",
2350 | "賧": "赕",
2351 | "質": "质",
2352 | "賫": "赍",
2353 | "賬": "账",
2354 | "賭": "赌",
2355 | "賰": "䞐",
2356 | "賴": "赖",
2357 | "賵": "赗",
2358 | "賺": "赚",
2359 | "賻": "赙",
2360 | "購": "购",
2361 | "賽": "赛",
2362 | "賾": "赜",
2363 | "贃": "𧹗",
2364 | "贄": "贽",
2365 | "贅": "赘",
2366 | "贇": "赟",
2367 | "贈": "赠",
2368 | "贉": "𫎫",
2369 | "贊": "赞",
2370 | "贋": "赝",
2371 | "贍": "赡",
2372 | "贏": "赢",
2373 | "贐": "赆",
2374 | "贑": "𫎬",
2375 | "贓": "赃",
2376 | "贔": "赑",
2377 | "贖": "赎",
2378 | "贗": "赝",
2379 | "贚": "𫎦",
2380 | "贛": "赣",
2381 | "贜": "赃",
2382 | "赬": "赪",
2383 | "趕": "赶",
2384 | "趙": "赵",
2385 | "趨": "趋",
2386 | "趲": "趱",
2387 | "跡": "迹",
2388 | "踐": "践",
2389 | "踰": "逾",
2390 | "踴": "踊",
2391 | "蹌": "跄",
2392 | "蹔": "𫏐",
2393 | "蹕": "跸",
2394 | "蹟": "迹",
2395 | "蹣": "蹒",
2396 | "蹤": "踪",
2397 | "蹳": "𫏆",
2398 | "蹺": "跷",
2399 | "蹻": "𫏋",
2400 | "躂": "跶",
2401 | "躉": "趸",
2402 | "躊": "踌",
2403 | "躋": "跻",
2404 | "躍": "跃",
2405 | "躎": "䟢",
2406 | "躑": "踯",
2407 | "躒": "跞",
2408 | "躓": "踬",
2409 | "躕": "蹰",
2410 | "躘": "𨀁",
2411 | "躚": "跹",
2412 | "躝": "𨅬",
2413 | "躡": "蹑",
2414 | "躥": "蹿",
2415 | "躦": "躜",
2416 | "躪": "躏",
2417 | "軀": "躯",
2418 | "軉": "𨉗",
2419 | "車": "车",
2420 | "軋": "轧",
2421 | "軌": "轨",
2422 | "軍": "军",
2423 | "軏": "𫐄",
2424 | "軑": "轪",
2425 | "軒": "轩",
2426 | "軔": "轫",
2427 | "軕": "𫐅",
2428 | "軗": "𨐅",
2429 | "軛": "轭",
2430 | "軜": "𫐇",
2431 | "軟": "软",
2432 | "軤": "轷",
2433 | "軨": "𫐉",
2434 | "軫": "轸",
2435 | "軬": "𫐊",
2436 | "軲": "轱",
2437 | "軷": "𫐈",
2438 | "軸": "轴",
2439 | "軹": "轵",
2440 | "軺": "轺",
2441 | "軻": "轲",
2442 | "軼": "轶",
2443 | "軾": "轼",
2444 | "軿": "𫐌",
2445 | "較": "较",
2446 | "輄": "𨐈",
2447 | "輅": "辂",
2448 | "輇": "辁",
2449 | "輈": "辀",
2450 | "載": "载",
2451 | "輊": "轾",
2452 | "輋": "𪨶",
2453 | "輒": "辄",
2454 | "輓": "挽",
2455 | "輔": "辅",
2456 | "輕": "轻",
2457 | "輖": "𫐏",
2458 | "輗": "𫐐",
2459 | "輛": "辆",
2460 | "輜": "辎",
2461 | "輝": "辉",
2462 | "輞": "辋",
2463 | "輟": "辍",
2464 | "輢": "𫐎",
2465 | "輥": "辊",
2466 | "輦": "辇",
2467 | "輨": "𫐑",
2468 | "輩": "辈",
2469 | "輪": "轮",
2470 | "輬": "辌",
2471 | "輮": "𫐓",
2472 | "輯": "辑",
2473 | "輳": "辏",
2474 | "輷": "𫐒",
2475 | "輸": "输",
2476 | "輻": "辐",
2477 | "輼": "辒",
2478 | "輾": "辗",
2479 | "輿": "舆",
2480 | "轀": "辒",
2481 | "轂": "毂",
2482 | "轄": "辖",
2483 | "轅": "辕",
2484 | "轆": "辘",
2485 | "轇": "𫐖",
2486 | "轉": "转",
2487 | "轊": "𫐕",
2488 | "轍": "辙",
2489 | "轎": "轿",
2490 | "轐": "𫐗",
2491 | "轔": "辚",
2492 | "轗": "𫐘",
2493 | "轟": "轰",
2494 | "轠": "𫐙",
2495 | "轡": "辔",
2496 | "轢": "轹",
2497 | "轣": "𫐆",
2498 | "轤": "轳",
2499 | "辦": "办",
2500 | "辭": "辞",
2501 | "辮": "辫",
2502 | "辯": "辩",
2503 | "農": "农",
2504 | "迴": "回",
2505 | "逕": "迳",
2506 | "這": "这",
2507 | "連": "连",
2508 | "週": "周",
2509 | "進": "进",
2510 | "遊": "游",
2511 | "運": "运",
2512 | "過": "过",
2513 | "達": "达",
2514 | "違": "违",
2515 | "遙": "遥",
2516 | "遜": "逊",
2517 | "遞": "递",
2518 | "遠": "远",
2519 | "遡": "溯",
2520 | "適": "适",
2521 | "遱": "𫐷",
2522 | "遲": "迟",
2523 | "遷": "迁",
2524 | "選": "选",
2525 | "遺": "遗",
2526 | "遼": "辽",
2527 | "邁": "迈",
2528 | "還": "还",
2529 | "邇": "迩",
2530 | "邊": "边",
2531 | "邏": "逻",
2532 | "邐": "逦",
2533 | "郟": "郏",
2534 | "郵": "邮",
2535 | "鄆": "郓",
2536 | "鄉": "乡",
2537 | "鄒": "邹",
2538 | "鄔": "邬",
2539 | "鄖": "郧",
2540 | "鄟": "𫑘",
2541 | "鄧": "邓",
2542 | "鄭": "郑",
2543 | "鄰": "邻",
2544 | "鄲": "郸",
2545 | "鄳": "𫑡",
2546 | "鄴": "邺",
2547 | "鄶": "郐",
2548 | "鄺": "邝",
2549 | "酇": "酂",
2550 | "酈": "郦",
2551 | "醃": "腌",
2552 | "醖": "酝",
2553 | "醜": "丑",
2554 | "醞": "酝",
2555 | "醟": "蒏",
2556 | "醣": "糖",
2557 | "醫": "医",
2558 | "醬": "酱",
2559 | "醱": "酦",
2560 | "醶": "𫑷",
2561 | "釀": "酿",
2562 | "釁": "衅",
2563 | "釃": "酾",
2564 | "釅": "酽",
2565 | "釋": "释",
2566 | "釐": "厘",
2567 | "釒": "钅",
2568 | "釓": "钆",
2569 | "釔": "钇",
2570 | "釕": "钌",
2571 | "釗": "钊",
2572 | "釘": "钉",
2573 | "釙": "钋",
2574 | "釚": "𫟲",
2575 | "針": "针",
2576 | "釟": "𫓥",
2577 | "釣": "钓",
2578 | "釤": "钐",
2579 | "釦": "扣",
2580 | "釧": "钏",
2581 | "釨": "𫓦",
2582 | "釩": "钒",
2583 | "釲": "𫟳",
2584 | "釳": "𨰿",
2585 | "釵": "钗",
2586 | "釷": "钍",
2587 | "釹": "钕",
2588 | "釺": "钎",
2589 | "釾": "䥺",
2590 | "鈀": "钯",
2591 | "鈁": "钫",
2592 | "鈃": "钘",
2593 | "鈄": "钭",
2594 | "鈅": "钥",
2595 | "鈆": "𫓪",
2596 | "鈇": "𫓧",
2597 | "鈈": "钚",
2598 | "鈉": "钠",
2599 | "鈋": "𨱂",
2600 | "鈍": "钝",
2601 | "鈎": "钩",
2602 | "鈐": "钤",
2603 | "鈑": "钣",
2604 | "鈒": "钑",
2605 | "鈔": "钞",
2606 | "鈕": "钮",
2607 | "鈖": "𫟴",
2608 | "鈗": "𫟵",
2609 | "鈛": "𫓨",
2610 | "鈞": "钧",
2611 | "鈠": "𨱁",
2612 | "鈡": "钟",
2613 | "鈣": "钙",
2614 | "鈥": "钬",
2615 | "鈦": "钛",
2616 | "鈧": "钪",
2617 | "鈮": "铌",
2618 | "鈯": "𨱄",
2619 | "鈰": "铈",
2620 | "鈲": "𨱃",
2621 | "鈳": "钶",
2622 | "鈴": "铃",
2623 | "鈷": "钴",
2624 | "鈸": "钹",
2625 | "鈹": "铍",
2626 | "鈺": "钰",
2627 | "鈽": "钸",
2628 | "鈾": "铀",
2629 | "鈿": "钿",
2630 | "鉀": "钾",
2631 | "鉁": "𨱅",
2632 | "鉅": "巨",
2633 | "鉆": "钻",
2634 | "鉈": "铊",
2635 | "鉉": "铉",
2636 | "鉋": "铇",
2637 | "鉍": "铋",
2638 | "鉑": "铂",
2639 | "鉔": "𫓬",
2640 | "鉕": "钷",
2641 | "鉗": "钳",
2642 | "鉚": "铆",
2643 | "鉛": "铅",
2644 | "鉝": "𫟷",
2645 | "鉞": "钺",
2646 | "鉠": "𫓭",
2647 | "鉢": "钵",
2648 | "鉤": "钩",
2649 | "鉦": "钲",
2650 | "鉬": "钼",
2651 | "鉭": "钽",
2652 | "鉳": "锫",
2653 | "鉶": "铏",
2654 | "鉷": "𫟹",
2655 | "鉸": "铰",
2656 | "鉺": "铒",
2657 | "鉻": "铬",
2658 | "鉽": "𫟸",
2659 | "鉾": "𫓴",
2660 | "鉿": "铪",
2661 | "銀": "银",
2662 | "銁": "𫓲",
2663 | "銂": "𫟻",
2664 | "銃": "铳",
2665 | "銅": "铜",
2666 | "銈": "𫓯",
2667 | "銊": "𫓰",
2668 | "銍": "铚",
2669 | "銏": "𫟶",
2670 | "銑": "铣",
2671 | "銓": "铨",
2672 | "銖": "铢",
2673 | "銘": "铭",
2674 | "銚": "铫",
2675 | "銛": "铦",
2676 | "銜": "衔",
2677 | "銠": "铑",
2678 | "銣": "铷",
2679 | "銥": "铱",
2680 | "銦": "铟",
2681 | "銨": "铵",
2682 | "銩": "铥",
2683 | "銪": "铕",
2684 | "銫": "铯",
2685 | "銬": "铐",
2686 | "銱": "铞",
2687 | "銳": "锐",
2688 | "銶": "𨱇",
2689 | "銷": "销",
2690 | "銹": "锈",
2691 | "銻": "锑",
2692 | "銼": "锉",
2693 | "鋁": "铝",
2694 | "鋂": "镅",
2695 | "鋃": "锒",
2696 | "鋅": "锌",
2697 | "鋇": "钡",
2698 | "鋉": "𨱈",
2699 | "鋌": "铤",
2700 | "鋏": "铗",
2701 | "鋒": "锋",
2702 | "鋗": "𫓶",
2703 | "鋙": "铻",
2704 | "鋝": "锊",
2705 | "鋟": "锓",
2706 | "鋠": "𫓵",
2707 | "鋣": "铘",
2708 | "鋤": "锄",
2709 | "鋥": "锃",
2710 | "鋦": "锔",
2711 | "鋨": "锇",
2712 | "鋩": "铓",
2713 | "鋪": "铺",
2714 | "鋭": "锐",
2715 | "鋮": "铖",
2716 | "鋯": "锆",
2717 | "鋰": "锂",
2718 | "鋱": "铽",
2719 | "鋶": "锍",
2720 | "鋸": "锯",
2721 | "鋼": "钢",
2722 | "錀": "𬬭",
2723 | "錁": "锞",
2724 | "錂": "𨱋",
2725 | "錄": "录",
2726 | "錆": "锖",
2727 | "錇": "锫",
2728 | "錈": "锩",
2729 | "錏": "铔",
2730 | "錐": "锥",
2731 | "錒": "锕",
2732 | "錕": "锟",
2733 | "錘": "锤",
2734 | "錙": "锱",
2735 | "錚": "铮",
2736 | "錛": "锛",
2737 | "錜": "𫓻",
2738 | "錝": "𫓽",
2739 | "錟": "锬",
2740 | "錠": "锭",
2741 | "錡": "锜",
2742 | "錢": "钱",
2743 | "錤": "𫓹",
2744 | "錥": "𫓾",
2745 | "錦": "锦",
2746 | "錨": "锚",
2747 | "錩": "锠",
2748 | "錫": "锡",
2749 | "錮": "锢",
2750 | "錯": "错",
2751 | "録": "录",
2752 | "錳": "锰",
2753 | "錶": "表",
2754 | "錸": "铼",
2755 | "錼": "镎",
2756 | "錽": "𫓸",
2757 | "鍀": "锝",
2758 | "鍁": "锨",
2759 | "鍃": "锪",
2760 | "鍄": "𨱉",
2761 | "鍅": "钫",
2762 | "鍆": "钔",
2763 | "鍇": "锴",
2764 | "鍈": "锳",
2765 | "鍉": "𫔂",
2766 | "鍊": "炼",
2767 | "鍋": "锅",
2768 | "鍍": "镀",
2769 | "鍒": "𫔄",
2770 | "鍔": "锷",
2771 | "鍘": "铡",
2772 | "鍚": "钖",
2773 | "鍛": "锻",
2774 | "鍠": "锽",
2775 | "鍤": "锸",
2776 | "鍥": "锲",
2777 | "鍩": "锘",
2778 | "鍬": "锹",
2779 | "鍮": "𨱎",
2780 | "鍰": "锾",
2781 | "鍵": "键",
2782 | "鍶": "锶",
2783 | "鍺": "锗",
2784 | "鍼": "针",
2785 | "鍾": "钟",
2786 | "鎂": "镁",
2787 | "鎄": "锿",
2788 | "鎇": "镅",
2789 | "鎈": "𫟿",
2790 | "鎊": "镑",
2791 | "鎌": "镰",
2792 | "鎍": "𫔅",
2793 | "鎔": "镕",
2794 | "鎖": "锁",
2795 | "鎘": "镉",
2796 | "鎙": "𫔈",
2797 | "鎚": "锤",
2798 | "鎛": "镈",
2799 | "鎝": "𨱏",
2800 | "鎞": "𫔇",
2801 | "鎡": "镃",
2802 | "鎢": "钨",
2803 | "鎣": "蓥",
2804 | "鎦": "镏",
2805 | "鎧": "铠",
2806 | "鎩": "铩",
2807 | "鎪": "锼",
2808 | "鎬": "镐",
2809 | "鎭": "镇",
2810 | "鎮": "镇",
2811 | "鎯": "𨱍",
2812 | "鎰": "镒",
2813 | "鎲": "镋",
2814 | "鎳": "镍",
2815 | "鎵": "镓",
2816 | "鎶": "鿔",
2817 | "鎷": "𨰾",
2818 | "鎸": "镌",
2819 | "鎿": "镎",
2820 | "鏃": "镞",
2821 | "鏆": "𨱌",
2822 | "鏇": "镟",
2823 | "鏈": "链",
2824 | "鏉": "𨱒",
2825 | "鏌": "镆",
2826 | "鏍": "镙",
2827 | "鏐": "镠",
2828 | "鏑": "镝",
2829 | "鏗": "铿",
2830 | "鏘": "锵",
2831 | "鏚": "戚",
2832 | "鏜": "镗",
2833 | "鏝": "镘",
2834 | "鏞": "镛",
2835 | "鏟": "铲",
2836 | "鏡": "镜",
2837 | "鏢": "镖",
2838 | "鏤": "镂",
2839 | "鏥": "𫔊",
2840 | "鏦": "𫓩",
2841 | "鏨": "錾",
2842 | "鏰": "镚",
2843 | "鏵": "铧",
2844 | "鏷": "镤",
2845 | "鏹": "镪",
2846 | "鏺": "䥽",
2847 | "鏽": "锈",
2848 | "鏾": "𫔌",
2849 | "鐃": "铙",
2850 | "鐄": "𨱑",
2851 | "鐇": "𫔍",
2852 | "鐈": "𫓱",
2853 | "鐋": "铴",
2854 | "鐍": "𫔎",
2855 | "鐎": "𨱓",
2856 | "鐏": "𨱔",
2857 | "鐐": "镣",
2858 | "鐒": "铹",
2859 | "鐓": "镦",
2860 | "鐔": "镡",
2861 | "鐗": "锏",
2862 | "鐘": "钟",
2863 | "鐙": "镫",
2864 | "鐝": "镢",
2865 | "鐠": "镨",
2866 | "鐥": "䦅",
2867 | "鐦": "锎",
2868 | "鐧": "锏",
2869 | "鐨": "镄",
2870 | "鐪": "𫓺",
2871 | "鐫": "镌",
2872 | "鐮": "镰",
2873 | "鐯": "䦃",
2874 | "鐲": "镯",
2875 | "鐳": "镭",
2876 | "鐵": "铁",
2877 | "鐶": "镮",
2878 | "鐸": "铎",
2879 | "鐺": "铛",
2880 | "鐼": "𫔁",
2881 | "鐽": "𫟼",
2882 | "鐿": "镱",
2883 | "鑀": "锿",
2884 | "鑄": "铸",
2885 | "鑉": "𫠁",
2886 | "鑊": "镬",
2887 | "鑌": "镔",
2888 | "鑑": "鉴",
2889 | "鑒": "鉴",
2890 | "鑔": "镲",
2891 | "鑕": "锧",
2892 | "鑞": "镴",
2893 | "鑠": "铄",
2894 | "鑣": "镳",
2895 | "鑥": "镥",
2896 | "鑪": "𬬻",
2897 | "鑭": "镧",
2898 | "鑰": "钥",
2899 | "鑱": "镵",
2900 | "鑲": "镶",
2901 | "鑴": "𫔔",
2902 | "鑷": "镊",
2903 | "鑹": "镩",
2904 | "鑼": "锣",
2905 | "鑽": "钻",
2906 | "鑾": "銮",
2907 | "鑿": "凿",
2908 | "钁": "镢",
2909 | "钂": "镋",
2910 | "镟": "旋",
2911 | "長": "长",
2912 | "門": "门",
2913 | "閂": "闩",
2914 | "閃": "闪",
2915 | "閆": "闫",
2916 | "閈": "闬",
2917 | "閉": "闭",
2918 | "開": "开",
2919 | "閌": "闶",
2920 | "閍": "𨸂",
2921 | "閎": "闳",
2922 | "閏": "闰",
2923 | "閐": "𨸃",
2924 | "閑": "闲",
2925 | "閒": "闲",
2926 | "間": "间",
2927 | "閔": "闵",
2928 | "閗": "𫔯",
2929 | "閘": "闸",
2930 | "閝": "𫠂",
2931 | "閞": "𫔰",
2932 | "閡": "阂",
2933 | "閣": "阁",
2934 | "閤": "合",
2935 | "閥": "阀",
2936 | "閨": "闺",
2937 | "閩": "闽",
2938 | "閫": "阃",
2939 | "閬": "阆",
2940 | "閭": "闾",
2941 | "閱": "阅",
2942 | "閲": "阅",
2943 | "閵": "𫔴",
2944 | "閶": "阊",
2945 | "閹": "阉",
2946 | "閻": "阎",
2947 | "閼": "阏",
2948 | "閽": "阍",
2949 | "閾": "阈",
2950 | "閿": "阌",
2951 | "闃": "阒",
2952 | "闆": "板",
2953 | "闇": "暗",
2954 | "闈": "闱",
2955 | "闊": "阔",
2956 | "闋": "阕",
2957 | "闌": "阑",
2958 | "闍": "阇",
2959 | "闐": "阗",
2960 | "闑": "𫔶",
2961 | "闒": "阘",
2962 | "闓": "闿",
2963 | "闔": "阖",
2964 | "闕": "阙",
2965 | "闖": "闯",
2966 | "關": "关",
2967 | "闞": "阚",
2968 | "闠": "阓",
2969 | "闡": "阐",
2970 | "闢": "辟",
2971 | "闤": "阛",
2972 | "闥": "闼",
2973 | "阪": "阪",
2974 | "陘": "陉",
2975 | "陝": "陕",
2976 | "陞": "升",
2977 | "陣": "阵",
2978 | "陰": "阴",
2979 | "陳": "陈",
2980 | "陸": "陆",
2981 | "陽": "阳",
2982 | "隉": "陧",
2983 | "隊": "队",
2984 | "階": "阶",
2985 | "隕": "陨",
2986 | "際": "际",
2987 | "隨": "随",
2988 | "險": "险",
2989 | "隯": "陦",
2990 | "隱": "隐",
2991 | "隴": "陇",
2992 | "隸": "隶",
2993 | "隻": "只",
2994 | "雋": "隽",
2995 | "雖": "虽",
2996 | "雙": "双",
2997 | "雛": "雏",
2998 | "雜": "杂",
2999 | "雞": "鸡",
3000 | "離": "离",
3001 | "難": "难",
3002 | "雲": "云",
3003 | "電": "电",
3004 | "霢": "霡",
3005 | "霣": "𫕥",
3006 | "霧": "雾",
3007 | "霼": "𪵣",
3008 | "霽": "霁",
3009 | "靂": "雳",
3010 | "靄": "霭",
3011 | "靆": "叇",
3012 | "靈": "灵",
3013 | "靉": "叆",
3014 | "靚": "靓",
3015 | "靜": "静",
3016 | "靝": "靔",
3017 | "靦": "腼",
3018 | "靧": "𫖃",
3019 | "靨": "靥",
3020 | "鞀": "鼗",
3021 | "鞏": "巩",
3022 | "鞝": "绱",
3023 | "鞦": "秋",
3024 | "鞽": "鞒",
3025 | "鞾": "𫖇",
3026 | "韁": "缰",
3027 | "韃": "鞑",
3028 | "韆": "千",
3029 | "韉": "鞯",
3030 | "韋": "韦",
3031 | "韌": "韧",
3032 | "韍": "韨",
3033 | "韓": "韩",
3034 | "韙": "韪",
3035 | "韚": "𫠅",
3036 | "韛": "𫖔",
3037 | "韜": "韬",
3038 | "韝": "鞲",
3039 | "韞": "韫",
3040 | "韠": "𫖒",
3041 | "韻": "韵",
3042 | "響": "响",
3043 | "頁": "页",
3044 | "頂": "顶",
3045 | "頃": "顷",
3046 | "項": "项",
3047 | "順": "顺",
3048 | "頇": "顸",
3049 | "須": "须",
3050 | "頊": "顼",
3051 | "頌": "颂",
3052 | "頍": "𫠆",
3053 | "頎": "颀",
3054 | "頏": "颃",
3055 | "預": "预",
3056 | "頑": "顽",
3057 | "頒": "颁",
3058 | "頓": "顿",
3059 | "頗": "颇",
3060 | "領": "领",
3061 | "頜": "颌",
3062 | "頡": "颉",
3063 | "頤": "颐",
3064 | "頦": "颏",
3065 | "頫": "𫖯",
3066 | "頭": "头",
3067 | "頮": "颒",
3068 | "頰": "颊",
3069 | "頲": "颋",
3070 | "頴": "颕",
3071 | "頵": "𫖳",
3072 | "頷": "颔",
3073 | "頸": "颈",
3074 | "頹": "颓",
3075 | "頻": "频",
3076 | "頽": "颓",
3077 | "顂": "𩓋",
3078 | "顃": "𩖖",
3079 | "顅": "𫖶",
3080 | "顆": "颗",
3081 | "題": "题",
3082 | "額": "额",
3083 | "顎": "颚",
3084 | "顏": "颜",
3085 | "顒": "颙",
3086 | "顓": "颛",
3087 | "顔": "颜",
3088 | "顗": "𫖮",
3089 | "願": "愿",
3090 | "顙": "颡",
3091 | "顛": "颠",
3092 | "類": "类",
3093 | "顢": "颟",
3094 | "顣": "𫖹",
3095 | "顥": "颢",
3096 | "顧": "顾",
3097 | "顫": "颤",
3098 | "顬": "颥",
3099 | "顯": "显",
3100 | "顰": "颦",
3101 | "顱": "颅",
3102 | "顳": "颞",
3103 | "顴": "颧",
3104 | "風": "风",
3105 | "颭": "飐",
3106 | "颮": "飑",
3107 | "颯": "飒",
3108 | "颰": "𩙥",
3109 | "颱": "台",
3110 | "颳": "刮",
3111 | "颶": "飓",
3112 | "颷": "𩙪",
3113 | "颸": "飔",
3114 | "颺": "飏",
3115 | "颻": "飖",
3116 | "颼": "飕",
3117 | "颾": "𩙫",
3118 | "飀": "飗",
3119 | "飄": "飘",
3120 | "飆": "飙",
3121 | "飈": "飚",
3122 | "飋": "𫗋",
3123 | "飛": "飞",
3124 | "飠": "饣",
3125 | "飢": "饥",
3126 | "飣": "饤",
3127 | "飥": "饦",
3128 | "飦": "𫗞",
3129 | "飩": "饨",
3130 | "飪": "饪",
3131 | "飫": "饫",
3132 | "飭": "饬",
3133 | "飯": "饭",
3134 | "飱": "飧",
3135 | "飲": "饮",
3136 | "飴": "饴",
3137 | "飵": "𫗢",
3138 | "飶": "𫗣",
3139 | "飼": "饲",
3140 | "飽": "饱",
3141 | "飾": "饰",
3142 | "飿": "饳",
3143 | "餃": "饺",
3144 | "餄": "饸",
3145 | "餅": "饼",
3146 | "餉": "饷",
3147 | "養": "养",
3148 | "餌": "饵",
3149 | "餎": "饹",
3150 | "餏": "饻",
3151 | "餑": "饽",
3152 | "餒": "馁",
3153 | "餓": "饿",
3154 | "餔": "𫗦",
3155 | "餕": "馂",
3156 | "餖": "饾",
3157 | "餗": "𫗧",
3158 | "餘": "余",
3159 | "餚": "肴",
3160 | "餛": "馄",
3161 | "餜": "馃",
3162 | "餞": "饯",
3163 | "餡": "馅",
3164 | "餦": "𫗠",
3165 | "餧": "𫗪",
3166 | "館": "馆",
3167 | "餪": "𫗬",
3168 | "餫": "𫗥",
3169 | "餬": "糊",
3170 | "餭": "𫗮",
3171 | "餱": "糇",
3172 | "餳": "饧",
3173 | "餵": "喂",
3174 | "餶": "馉",
3175 | "餷": "馇",
3176 | "餸": "𩠌",
3177 | "餺": "馎",
3178 | "餼": "饩",
3179 | "餾": "馏",
3180 | "餿": "馊",
3181 | "饁": "馌",
3182 | "饃": "馍",
3183 | "饅": "馒",
3184 | "饈": "馐",
3185 | "饉": "馑",
3186 | "饊": "馓",
3187 | "饋": "馈",
3188 | "饌": "馔",
3189 | "饑": "饥",
3190 | "饒": "饶",
3191 | "饗": "飨",
3192 | "饘": "𫗴",
3193 | "饜": "餍",
3194 | "饞": "馋",
3195 | "饟": "𫗵",
3196 | "饠": "𫗩",
3197 | "饢": "馕",
3198 | "馬": "马",
3199 | "馭": "驭",
3200 | "馮": "冯",
3201 | "馯": "𫘛",
3202 | "馱": "驮",
3203 | "馳": "驰",
3204 | "馴": "驯",
3205 | "馹": "驲",
3206 | "馼": "𫘜",
3207 | "駁": "驳",
3208 | "駃": "𫘝",
3209 | "駊": "𫘟",
3210 | "駎": "𩧨",
3211 | "駐": "驻",
3212 | "駑": "驽",
3213 | "駒": "驹",
3214 | "駔": "驵",
3215 | "駕": "驾",
3216 | "駘": "骀",
3217 | "駙": "驸",
3218 | "駚": "𩧫",
3219 | "駛": "驶",
3220 | "駝": "驼",
3221 | "駞": "𫘞",
3222 | "駟": "驷",
3223 | "駡": "骂",
3224 | "駢": "骈",
3225 | "駤": "𫘠",
3226 | "駧": "𩧲",
3227 | "駩": "𩧴",
3228 | "駫": "𫘡",
3229 | "駭": "骇",
3230 | "駰": "骃",
3231 | "駱": "骆",
3232 | "駶": "𩧺",
3233 | "駸": "骎",
3234 | "駻": "𫘣",
3235 | "駿": "骏",
3236 | "騁": "骋",
3237 | "騂": "骍",
3238 | "騃": "𫘤",
3239 | "騄": "𫘧",
3240 | "騅": "骓",
3241 | "騉": "𫘥",
3242 | "騊": "𫘦",
3243 | "騌": "骔",
3244 | "騍": "骒",
3245 | "騎": "骑",
3246 | "騏": "骐",
3247 | "騔": "𩨀",
3248 | "騖": "骛",
3249 | "騙": "骗",
3250 | "騚": "𩨊",
3251 | "騜": "𫘩",
3252 | "騝": "𩨃",
3253 | "騟": "𩨈",
3254 | "騠": "𫘨",
3255 | "騤": "骙",
3256 | "騧": "䯄",
3257 | "騪": "𩨄",
3258 | "騫": "骞",
3259 | "騭": "骘",
3260 | "騮": "骝",
3261 | "騰": "腾",
3262 | "騱": "𫘬",
3263 | "騴": "𫘫",
3264 | "騵": "𫘪",
3265 | "騶": "驺",
3266 | "騷": "骚",
3267 | "騸": "骟",
3268 | "騻": "𫘭",
3269 | "騼": "𫠋",
3270 | "騾": "骡",
3271 | "驀": "蓦",
3272 | "驁": "骜",
3273 | "驂": "骖",
3274 | "驃": "骠",
3275 | "驄": "骢",
3276 | "驅": "驱",
3277 | "驊": "骅",
3278 | "驋": "𩧯",
3279 | "驌": "骕",
3280 | "驍": "骁",
3281 | "驏": "骣",
3282 | "驓": "𫘯",
3283 | "驕": "骄",
3284 | "驗": "验",
3285 | "驙": "𫘰",
3286 | "驚": "惊",
3287 | "驛": "驿",
3288 | "驟": "骤",
3289 | "驢": "驴",
3290 | "驤": "骧",
3291 | "驥": "骥",
3292 | "驦": "骦",
3293 | "驨": "𫘱",
3294 | "驪": "骊",
3295 | "驫": "骉",
3296 | "骯": "肮",
3297 | "髏": "髅",
3298 | "髒": "脏",
3299 | "體": "体",
3300 | "髕": "髌",
3301 | "髖": "髋",
3302 | "髮": "发",
3303 | "鬆": "松",
3304 | "鬍": "胡",
3305 | "鬖": "𩭹",
3306 | "鬚": "须",
3307 | "鬠": "𫘽",
3308 | "鬢": "鬓",
3309 | "鬥": "斗",
3310 | "鬧": "闹",
3311 | "鬨": "哄",
3312 | "鬩": "阋",
3313 | "鬮": "阄",
3314 | "鬱": "郁",
3315 | "鬹": "鬶",
3316 | "魎": "魉",
3317 | "魘": "魇",
3318 | "魚": "鱼",
3319 | "魛": "鱽",
3320 | "魟": "𫚉",
3321 | "魢": "鱾",
3322 | "魥": "𩽹",
3323 | "魦": "𫚌",
3324 | "魨": "鲀",
3325 | "魯": "鲁",
3326 | "魴": "鲂",
3327 | "魵": "𫚍",
3328 | "魷": "鱿",
3329 | "魺": "鲄",
3330 | "魽": "𫠐",
3331 | "鮁": "鲅",
3332 | "鮃": "鲆",
3333 | "鮄": "𫚒",
3334 | "鮅": "𫚑",
3335 | "鮆": "𫚖",
3336 | "鮊": "鲌",
3337 | "鮋": "鲉",
3338 | "鮍": "鲏",
3339 | "鮎": "鲇",
3340 | "鮐": "鲐",
3341 | "鮑": "鲍",
3342 | "鮒": "鲋",
3343 | "鮓": "鲊",
3344 | "鮕": "𩾀",
3345 | "鮚": "鲒",
3346 | "鮜": "鲘",
3347 | "鮝": "鲞",
3348 | "鮞": "鲕",
3349 | "鮟": "𩽾",
3350 | "鮣": "䲟",
3351 | "鮤": "𫚓",
3352 | "鮦": "鲖",
3353 | "鮪": "鲔",
3354 | "鮫": "鲛",
3355 | "鮭": "鲑",
3356 | "鮮": "鲜",
3357 | "鮯": "𫚗",
3358 | "鮰": "𫚔",
3359 | "鮳": "鲓",
3360 | "鮵": "𫚛",
3361 | "鮶": "鲪",
3362 | "鮸": "𩾃",
3363 | "鮺": "鲝",
3364 | "鮿": "𫚚",
3365 | "鯀": "鲧",
3366 | "鯁": "鲠",
3367 | "鯄": "𩾁",
3368 | "鯆": "𫚙",
3369 | "鯇": "鲩",
3370 | "鯉": "鲤",
3371 | "鯊": "鲨",
3372 | "鯒": "鲬",
3373 | "鯔": "鲻",
3374 | "鯕": "鲯",
3375 | "鯖": "鲭",
3376 | "鯗": "鲞",
3377 | "鯛": "鲷",
3378 | "鯝": "鲴",
3379 | "鯞": "𫚡",
3380 | "鯡": "鲱",
3381 | "鯢": "鲵",
3382 | "鯤": "鲲",
3383 | "鯧": "鲳",
3384 | "鯨": "鲸",
3385 | "鯪": "鲮",
3386 | "鯫": "鲰",
3387 | "鯬": "𫚞",
3388 | "鯰": "鲶",
3389 | "鯱": "𩾇",
3390 | "鯴": "鲺",
3391 | "鯶": "𩽼",
3392 | "鯷": "鳀",
3393 | "鯽": "鲫",
3394 | "鯾": "𫚣",
3395 | "鯿": "鳊",
3396 | "鰁": "鳈",
3397 | "鰂": "鲗",
3398 | "鰃": "鳂",
3399 | "鰆": "䲠",
3400 | "鰈": "鲽",
3401 | "鰉": "鳇",
3402 | "鰋": "𫚢",
3403 | "鰌": "䲡",
3404 | "鰍": "鳅",
3405 | "鰏": "鲾",
3406 | "鰐": "鳄",
3407 | "鰑": "𫚊",
3408 | "鰒": "鳆",
3409 | "鰓": "鳃",
3410 | "鰕": "𫚥",
3411 | "鰛": "鳁",
3412 | "鰜": "鳒",
3413 | "鰟": "鳑",
3414 | "鰠": "鳋",
3415 | "鰣": "鲥",
3416 | "鰤": "𫚕",
3417 | "鰥": "鳏",
3418 | "鰦": "𫚤",
3419 | "鰧": "䲢",
3420 | "鰨": "鳎",
3421 | "鰩": "鳐",
3422 | "鰫": "𫚦",
3423 | "鰭": "鳍",
3424 | "鰮": "鳁",
3425 | "鰱": "鲢",
3426 | "鰲": "鳌",
3427 | "鰳": "鳓",
3428 | "鰵": "鳘",
3429 | "鰷": "鲦",
3430 | "鰹": "鲣",
3431 | "鰺": "鲹",
3432 | "鰻": "鳗",
3433 | "鰼": "鳛",
3434 | "鰽": "𫚧",
3435 | "鰾": "鳔",
3436 | "鱂": "鳉",
3437 | "鱄": "𫚋",
3438 | "鱅": "鳙",
3439 | "鱆": "𫠒",
3440 | "鱇": "𩾌",
3441 | "鱈": "鳕",
3442 | "鱉": "鳖",
3443 | "鱊": "𫚪",
3444 | "鱒": "鳟",
3445 | "鱔": "鳝",
3446 | "鱖": "鳜",
3447 | "鱗": "鳞",
3448 | "鱘": "鲟",
3449 | "鱝": "鲼",
3450 | "鱟": "鲎",
3451 | "鱠": "鲙",
3452 | "鱢": "𫚫",
3453 | "鱣": "鳣",
3454 | "鱤": "鳡",
3455 | "鱧": "鳢",
3456 | "鱨": "鲿",
3457 | "鱭": "鲚",
3458 | "鱮": "𫚈",
3459 | "鱯": "鳠",
3460 | "鱲": "𫚭",
3461 | "鱷": "鳄",
3462 | "鱸": "鲈",
3463 | "鱺": "鲡",
3464 | "鳥": "鸟",
3465 | "鳧": "凫",
3466 | "鳩": "鸠",
3467 | "鳬": "凫",
3468 | "鳲": "鸤",
3469 | "鳳": "凤",
3470 | "鳴": "鸣",
3471 | "鳶": "鸢",
3472 | "鳷": "𫛛",
3473 | "鳼": "𪉃",
3474 | "鳽": "𫛚",
3475 | "鳾": "䴓",
3476 | "鴀": "𫛜",
3477 | "鴃": "𫛞",
3478 | "鴅": "𫛝",
3479 | "鴆": "鸩",
3480 | "鴇": "鸨",
3481 | "鴉": "鸦",
3482 | "鴐": "𫛤",
3483 | "鴒": "鸰",
3484 | "鴔": "𫛡",
3485 | "鴕": "鸵",
3486 | "鴗": "𫁡",
3487 | "鴛": "鸳",
3488 | "鴜": "𪉈",
3489 | "鴝": "鸲",
3490 | "鴞": "鸮",
3491 | "鴟": "鸱",
3492 | "鴣": "鸪",
3493 | "鴥": "𫛣",
3494 | "鴦": "鸯",
3495 | "鴨": "鸭",
3496 | "鴮": "𫛦",
3497 | "鴯": "鸸",
3498 | "鴰": "鸹",
3499 | "鴲": "𪉆",
3500 | "鴳": "𫛩",
3501 | "鴴": "鸻",
3502 | "鴷": "䴕",
3503 | "鴻": "鸿",
3504 | "鴽": "𫛪",
3505 | "鴿": "鸽",
3506 | "鵁": "䴔",
3507 | "鵂": "鸺",
3508 | "鵃": "鸼",
3509 | "鵊": "𫛥",
3510 | "鵐": "鹀",
3511 | "鵑": "鹃",
3512 | "鵒": "鹆",
3513 | "鵓": "鹁",
3514 | "鵚": "𪉍",
3515 | "鵜": "鹈",
3516 | "鵝": "鹅",
3517 | "鵟": "𫛭",
3518 | "鵠": "鹄",
3519 | "鵡": "鹉",
3520 | "鵧": "𫛨",
3521 | "鵩": "𫛳",
3522 | "鵪": "鹌",
3523 | "鵫": "𫛱",
3524 | "鵬": "鹏",
3525 | "鵮": "鹐",
3526 | "鵯": "鹎",
3527 | "鵰": "雕",
3528 | "鵲": "鹊",
3529 | "鵷": "鹓",
3530 | "鵾": "鹍",
3531 | "鶄": "䴖",
3532 | "鶇": "鸫",
3533 | "鶉": "鹑",
3534 | "鶊": "鹒",
3535 | "鶌": "𫛵",
3536 | "鶒": "𫛶",
3537 | "鶓": "鹋",
3538 | "鶖": "鹙",
3539 | "鶗": "𫛸",
3540 | "鶘": "鹕",
3541 | "鶚": "鹗",
3542 | "鶡": "鹖",
3543 | "鶥": "鹛",
3544 | "鶦": "𫛷",
3545 | "鶩": "鹜",
3546 | "鶪": "䴗",
3547 | "鶬": "鸧",
3548 | "鶭": "𫛯",
3549 | "鶯": "莺",
3550 | "鶰": "𫛫",
3551 | "鶲": "鹟",
3552 | "鶴": "鹤",
3553 | "鶹": "鹠",
3554 | "鶺": "鹡",
3555 | "鶻": "鹘",
3556 | "鶼": "鹣",
3557 | "鶿": "鹚",
3558 | "鷀": "鹚",
3559 | "鷁": "鹢",
3560 | "鷂": "鹞",
3561 | "鷄": "鸡",
3562 | "鷅": "𫛽",
3563 | "鷈": "䴘",
3564 | "鷉": "䴘",
3565 | "鷊": "鹝",
3566 | "鷐": "𫜀",
3567 | "鷓": "鹧",
3568 | "鷔": "𪉑",
3569 | "鷖": "鹥",
3570 | "鷗": "鸥",
3571 | "鷙": "鸷",
3572 | "鷚": "鹨",
3573 | "鷣": "𫜃",
3574 | "鷤": "𫛴",
3575 | "鷥": "鸶",
3576 | "鷦": "鹪",
3577 | "鷨": "𪉊",
3578 | "鷩": "𫜁",
3579 | "鷫": "鹔",
3580 | "鷯": "鹩",
3581 | "鷲": "鹫",
3582 | "鷳": "鹇",
3583 | "鷴": "鹇",
3584 | "鷷": "𫜄",
3585 | "鷸": "鹬",
3586 | "鷹": "鹰",
3587 | "鷺": "鹭",
3588 | "鷽": "鸴",
3589 | "鷿": "䴙",
3590 | "鸂": "㶉",
3591 | "鸇": "鹯",
3592 | "鸊": "䴙",
3593 | "鸋": "𫛢",
3594 | "鸌": "鹱",
3595 | "鸏": "鹲",
3596 | "鸕": "鸬",
3597 | "鸗": "𫛟",
3598 | "鸘": "鹴",
3599 | "鸚": "鹦",
3600 | "鸛": "鹳",
3601 | "鸝": "鹂",
3602 | "鸞": "鸾",
3603 | "鹵": "卤",
3604 | "鹹": "咸",
3605 | "鹺": "鹾",
3606 | "鹼": "碱",
3607 | "鹽": "盐",
3608 | "麗": "丽",
3609 | "麥": "麦",
3610 | "麨": "𪎊",
3611 | "麩": "麸",
3612 | "麪": "面",
3613 | "麫": "面",
3614 | "麬": "𤿲",
3615 | "麯": "曲",
3616 | "麲": "𪎉",
3617 | "麳": "𪎌",
3618 | "麴": "曲",
3619 | "麵": "面",
3620 | "麷": "𫜑",
3621 | "麼": "么",
3622 | "麽": "么",
3623 | "黃": "黄",
3624 | "黌": "黉",
3625 | "點": "点",
3626 | "黨": "党",
3627 | "黲": "黪",
3628 | "黴": "霉",
3629 | "黶": "黡",
3630 | "黷": "黩",
3631 | "黽": "黾",
3632 | "黿": "鼋",
3633 | "鼂": "鼌",
3634 | "鼉": "鼍",
3635 | "鼕": "冬",
3636 | "鼴": "鼹",
3637 | "齇": "齄",
3638 | "齊": "齐",
3639 | "齋": "斋",
3640 | "齎": "赍",
3641 | "齏": "齑",
3642 | "齒": "齿",
3643 | "齔": "龀",
3644 | "齕": "龁",
3645 | "齗": "龂",
3646 | "齙": "龅",
3647 | "齜": "龇",
3648 | "齟": "龃",
3649 | "齠": "龆",
3650 | "齡": "龄",
3651 | "齣": "出",
3652 | "齦": "龈",
3653 | "齧": "啮",
3654 | "齩": "𫜪",
3655 | "齪": "龊",
3656 | "齬": "龉",
3657 | "齭": "𫜭",
3658 | "齯": "𫠜",
3659 | "齰": "𫜬",
3660 | "齲": "龋",
3661 | "齴": "𫜮",
3662 | "齶": "腭",
3663 | "齷": "龌",
3664 | "齾": "𫜰",
3665 | "龍": "龙",
3666 | "龎": "厐",
3667 | "龐": "庞",
3668 | "龑": "䶮",
3669 | "龓": "𫜲",
3670 | "龔": "龚",
3671 | "龕": "龛",
3672 | "龜": "龟",
3673 | "龭": "𩨎",
3674 | "龯": "𨱆",
3675 | "鿁": "䜤",
3676 | "鿓": "鿒",
3677 | "𠁞": "𠀾",
3678 | "𠌥": "𠆿",
3679 | "𠏢": "𠉗",
3680 | "𠐊": "𫝋",
3681 | "𠗣": "㓆",
3682 | "𠞆": "𠛆",
3683 | "𠠎": "𠚳",
3684 | "𠬙": "𪠡",
3685 | "𠽃": "𪠺",
3686 | "𠿕": "𪜎",
3687 | "𡂡": "𪢒",
3688 | "𡃄": "𪡺",
3689 | "𡃕": "𠴛",
3690 | "𡃤": "𪢐",
3691 | "𡄔": "𠴢",
3692 | "𡄣": "𠵸",
3693 | "𡅏": "𠲥",
3694 | "𡅯": "𪢖",
3695 | "𡑭": "𡋗",
3696 | "𡓁": "𪤄",
3697 | "𡓾": "𡋀",
3698 | "𡔖": "𡍣",
3699 | "𡞵": "㛟",
3700 | "𡟫": "𫝪",
3701 | "𡠹": "㛿",
3702 | "𡡎": "𡞱",
3703 | "𡢃": "㛠",
3704 | "𡮉": "𡭜",
3705 | "𡮣": "𡭬",
3706 | "𡳳": "𡳃",
3707 | "𡸗": "𪨩",
3708 | "𡹬": "𪨹",
3709 | "𡻕": "岁",
3710 | "𡽗": "𡸃",
3711 | "𡾱": "㟜",
3712 | "𡿖": "𪩛",
3713 | "𢍰": "𪪴",
3714 | "𢠼": "𢙑",
3715 | "𢣐": "𪬚",
3716 | "𢣚": "𢘝",
3717 | "𢣭": "𢘞",
3718 | "𢤩": "𪫡",
3719 | "𢤱": "𢘙",
3720 | "𢤿": "𪬯",
3721 | "𢯷": "𪭝",
3722 | "𢶒": "𪭯",
3723 | "𢶫": "𢫞",
3724 | "𢷬": "𢭏",
3725 | "𢷮": "𢫊",
3726 | "𢹿": "𢬦",
3727 | "𢺳": "𪮳",
3728 | "𣈶": "暅",
3729 | "𣋋": "𣈣",
3730 | "𣍐": "𠊉",
3731 | "𣙎": "㭣",
3732 | "𣜬": "𪳗",
3733 | "𣝕": "𣘷",
3734 | "𣞻": "𣘓",
3735 | "𣠩": "𣞎",
3736 | "𣠲": "𣑶",
3737 | "𣯩": "𣯣",
3738 | "𣯴": "𣭤",
3739 | "𣯶": "毶",
3740 | "𣽏": "𪶮",
3741 | "𣾷": "㳢",
3742 | "𣿉": "𣶫",
3743 | "𤁣": "𣺽",
3744 | "𤄷": "𪶒",
3745 | "𤅶": "𣷷",
3746 | "𤑳": "𤎻",
3747 | "𤑹": "𪹀",
3748 | "𤒎": "𤊀",
3749 | "𤒻": "𪹹",
3750 | "𤓌": "𪹠",
3751 | "𤓩": "𤊰",
3752 | "𤘀": "𪺣",
3753 | "𤛮": "𤙯",
3754 | "𤛱": "𫞢",
3755 | "𤜆": "𪺪",
3756 | "𤠮": "𪺸",
3757 | "𤢟": "𤝢",
3758 | "𤢻": "𢢐",
3759 | "𤩂": "𫞧",
3760 | "𤪺": "㻘",
3761 | "𤫩": "㻏",
3762 | "𤬅": "𪼴",
3763 | "𤳷": "𪽝",
3764 | "𤳸": "𤳄",
3765 | "𤷃": "𪽭",
3766 | "𤸫": "𤶧",
3767 | "𤺔": "𪽴",
3768 | "𥊝": "𥅿",
3769 | "𥌃": "𥅘",
3770 | "𥏝": "𪿊",
3771 | "𥕥": "𥐰",
3772 | "𥖅": "𥐯",
3773 | "𥖲": "𪿞",
3774 | "𥗇": "𪿵",
3775 | "𥜐": "𫀓",
3776 | "𥜰": "𫀌",
3777 | "𥞵": "𥞦",
3778 | "𥢢": "䅪",
3779 | "𥢶": "𫞷",
3780 | "𥢷": "𫀮",
3781 | "𥨐": "𥧂",
3782 | "𥪂": "𥩺",
3783 | "𥯤": "𫁳",
3784 | "𥴨": "𫂖",
3785 | "𥴼": "𫁺",
3786 | "𥵃": "𥱔",
3787 | "𥵊": "𥭉",
3788 | "𥶽": "𫁱",
3789 | "𥸠": "𥮋",
3790 | "𥻦": "𫂿",
3791 | "𥼽": "𥹥",
3792 | "𥽖": "𥺇",
3793 | "𥾯": "𫄝",
3794 | "𥿊": "𦈈",
3795 | "𦀖": "𫄦",
3796 | "𦂅": "𦈒",
3797 | "𦃄": "𦈗",
3798 | "𦃩": "𫄯",
3799 | "𦅇": "𫄪",
3800 | "𦅈": "𫄵",
3801 | "𦆲": "𫟇",
3802 | "𦒀": "𫅥",
3803 | "𦔖": "𫅼",
3804 | "𦘧": "𡳒",
3805 | "𦟼": "𫆝",
3806 | "𦠅": "𫞅",
3807 | "𦡝": "𫆫",
3808 | "𦢈": "𣍨",
3809 | "𦣎": "𦟗",
3810 | "𦧺": "𫇘",
3811 | "𦪙": "䑽",
3812 | "𦪽": "𦨩",
3813 | "𦱌": "𫇪",
3814 | "𦾟": "𦶻",
3815 | "𧎈": "𧌥",
3816 | "𧒯": "𫊹",
3817 | "𧔥": "𧒭",
3818 | "𧕟": "𧉐",
3819 | "𧜗": "䘞",
3820 | "𧜵": "䙊",
3821 | "𧝞": "䘛",
3822 | "𧞫": "𫌋",
3823 | "𧟀": "𧝧",
3824 | "𧡴": "𫌫",
3825 | "𧢄": "𫌬",
3826 | "𧦝": "𫍞",
3827 | "𧦧": "𫍟",
3828 | "𧩕": "𫍭",
3829 | "𧩙": "䜥",
3830 | "𧩼": "𫍶",
3831 | "𧫝": "𫍺",
3832 | "𧬤": "𫍼",
3833 | "𧭈": "𫍾",
3834 | "𧭹": "𫍐",
3835 | "𧳟": "𧳕",
3836 | "𧵳": "䞌",
3837 | "𧶔": "𧹓",
3838 | "𧶧": "䞎",
3839 | "𧷎": "𪠀",
3840 | "𧸘": "𫎨",
3841 | "𧹈": "𪥠",
3842 | "𧽯": "𫎸",
3843 | "𨂐": "𫏌",
3844 | "𨄣": "𨀱",
3845 | "𨅍": "𨁴",
3846 | "𨆪": "𫏕",
3847 | "𨇁": "𧿈",
3848 | "𨇞": "𨅫",
3849 | "𨇤": "𫏨",
3850 | "𨇰": "𫏞",
3851 | "𨇽": "𫏑",
3852 | "𨈊": "𨂺",
3853 | "𨈌": "𨄄",
3854 | "𨊰": "䢀",
3855 | "𨊸": "䢁",
3856 | "𨊻": "𨐆",
3857 | "𨋢": "䢂",
3858 | "𨌈": "𫐍",
3859 | "𨍰": "𫐔",
3860 | "𨎌": "𫐋",
3861 | "𨎮": "𨐉",
3862 | "𨏠": "𨐇",
3863 | "𨏥": "𨐊",
3864 | "𨞺": "𫟫",
3865 | "𨟊": "𫟬",
3866 | "𨢿": "𨡙",
3867 | "𨣈": "𨡺",
3868 | "𨣞": "𨟳",
3869 | "𨣧": "𨠨",
3870 | "𨤻": "𨤰",
3871 | "𨥛": "𨱀",
3872 | "𨥟": "𫓫",
3873 | "𨦫": "䦀",
3874 | "𨧀": "𬭊",
3875 | "𨧜": "䦁",
3876 | "𨧰": "𫟽",
3877 | "𨧱": "𨱊",
3878 | "𨨏": "𬭛",
3879 | "𨨛": "𫓼",
3880 | "𨨢": "𫓿",
3881 | "𨩰": "𫟾",
3882 | "𨪕": "𫓮",
3883 | "𨫒": "𨱐",
3884 | "𨬖": "𫔏",
3885 | "𨭆": "𬭶",
3886 | "𨭎": "𬭳",
3887 | "𨭖": "𫔑",
3888 | "𨭸": "𫔐",
3889 | "𨮂": "𨱕",
3890 | "𨮳": "𫔒",
3891 | "𨯅": "䥿",
3892 | "𨯟": "𫔓",
3893 | "𨰃": "𫔉",
3894 | "𨰋": "𫓳",
3895 | "𨰥": "𫔕",
3896 | "𨰲": "𫔃",
3897 | "𨲳": "𫔖",
3898 | "𨳑": "𨸁",
3899 | "𨳕": "𨸀",
3900 | "𨴗": "𨸅",
3901 | "𨴹": "𫔲",
3902 | "𨵩": "𨸆",
3903 | "𨵸": "𨸇",
3904 | "𨶀": "𨸉",
3905 | "𨶏": "𨸊",
3906 | "𨶮": "𨸌",
3907 | "𨶲": "𨸋",
3908 | "𨷲": "𨸎",
3909 | "𨼳": "𫔽",
3910 | "𨽏": "𨸘",
3911 | "𩀨": "𫕚",
3912 | "𩅙": "𫕨",
3913 | "𩎖": "𫖑",
3914 | "𩎢": "𩏾",
3915 | "𩏂": "𫖓",
3916 | "𩏠": "𫖖",
3917 | "𩏪": "𩏽",
3918 | "𩏷": "𫃗",
3919 | "𩑔": "𫖪",
3920 | "𩒎": "𫖭",
3921 | "𩓣": "𩖕",
3922 | "𩓥": "𫖵",
3923 | "𩔑": "𫖷",
3924 | "𩔳": "𫖴",
3925 | "𩖰": "𫠇",
3926 | "𩗀": "𩙦",
3927 | "𩗓": "𫗈",
3928 | "𩗴": "𫗉",
3929 | "𩘀": "𩙩",
3930 | "𩘝": "𩙭",
3931 | "𩘹": "𩙨",
3932 | "𩘺": "𩙬",
3933 | "𩙈": "𩙰",
3934 | "𩚛": "𩟿",
3935 | "𩚥": "𩠀",
3936 | "𩚩": "𫗡",
3937 | "𩚵": "𩠁",
3938 | "𩛆": "𩠂",
3939 | "𩛌": "𫗤",
3940 | "𩛡": "𫗨",
3941 | "𩛩": "𩠃",
3942 | "𩜇": "𩠉",
3943 | "𩜦": "𩠆",
3944 | "𩜵": "𩠊",
3945 | "𩝔": "𩠋",
3946 | "𩝽": "𫗳",
3947 | "𩞄": "𩠎",
3948 | "𩞦": "𩠏",
3949 | "𩞯": "䭪",
3950 | "𩟐": "𩠅",
3951 | "𩟗": "𫗚",
3952 | "𩠴": "𩠠",
3953 | "𩡣": "𩡖",
3954 | "𩡺": "𩧦",
3955 | "𩢡": "𩧬",
3956 | "𩢴": "𩧵",
3957 | "𩢸": "𩧳",
3958 | "𩢾": "𩧮",
3959 | "𩣏": "𩧶",
3960 | "𩣑": "䯃",
3961 | "𩣫": "𩧸",
3962 | "𩣵": "𩧻",
3963 | "𩣺": "𩧼",
3964 | "𩤊": "𩧩",
3965 | "𩤙": "𩨆",
3966 | "𩤲": "𩨉",
3967 | "𩤸": "𩨅",
3968 | "𩥄": "𩨋",
3969 | "𩥇": "𩨍",
3970 | "𩥉": "𩧱",
3971 | "𩥑": "𩨌",
3972 | "𩦠": "𫠌",
3973 | "𩧆": "𩨐",
3974 | "𩭙": "𩬣",
3975 | "𩯁": "𫙂",
3976 | "𩯳": "𩯒",
3977 | "𩰀": "𩬤",
3978 | "𩰹": "𩰰",
3979 | "𩳤": "𩲒",
3980 | "𩴵": "𩴌",
3981 | "𩵦": "𫠏",
3982 | "𩵩": "𩽺",
3983 | "𩵹": "𩽻",
3984 | "𩶁": "𫚎",
3985 | "𩶘": "䲞",
3986 | "𩶰": "𩽿",
3987 | "𩶱": "𩽽",
3988 | "𩷰": "𩾄",
3989 | "𩸃": "𩾅",
3990 | "𩸄": "𫚝",
3991 | "𩸡": "𫚟",
3992 | "𩸦": "𩾆",
3993 | "𩻗": "𫚨",
3994 | "𩻬": "𫚩",
3995 | "𩻮": "𫚘",
3996 | "𩼶": "𫚬",
3997 | "𩽇": "𩾎",
3998 | "𩿅": "𫠖",
3999 | "𩿤": "𫛠",
4000 | "𩿪": "𪉄",
4001 | "𪀖": "𫛧",
4002 | "𪀦": "𪉅",
4003 | "𪀾": "𪉋",
4004 | "𪁈": "𪉉",
4005 | "𪁖": "𪉌",
4006 | "𪂆": "𪉎",
4007 | "𪃍": "𪉐",
4008 | "𪃏": "𪉏",
4009 | "𪃒": "𫛻",
4010 | "𪃧": "𫛹",
4011 | "𪄆": "𪉔",
4012 | "𪄕": "𪉒",
4013 | "𪅂": "𫜂",
4014 | "𪆷": "𫛾",
4015 | "𪇳": "𪉕",
4016 | "𪈼": "𪉓",
4017 | "𪉸": "𫜊",
4018 | "𪋿": "𪎍",
4019 | "𪌭": "𫜓",
4020 | "𪍠": "𫜕",
4021 | "𪓰": "𫜟",
4022 | "𪔵": "𪔭",
4023 | "𪘀": "𪚏",
4024 | "𪘯": "𪚐",
4025 | "𪙏": "𫜯",
4026 | "𪟖": "𠛾",
4027 | "𪷓": "𣶭",
4028 | "𫒡": "𫓷",
4029 | "𫜦": "𫜫",
4030 | }
4031 |
--------------------------------------------------------------------------------
/poster/heading.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/poster/heading.png
--------------------------------------------------------------------------------
/poster/multilingual.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/poster/multilingual.png
--------------------------------------------------------------------------------
/poster/poster.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Nowar Rounded Poster
8 |
9 |
168 |
169 |
170 |
171 |
172 |
Nowar Rounded
173 |
174 | - 有爱圆体
175 | - 有愛圓體
176 | - 有愛丸ゴシック
177 | - 有愛 굴림
178 |
179 |
180 |
181 |
182 |
Multilingual Support
183 |
184 | - English
I can eat glass and it doesn’t hurt me.
185 | - English (IPA)
/aɪ kæn iːt glɑːs ænd ɪt dɐz nɒt hɜːt miː/
186 | - Español
Puedo comer vidrio, no me hace daño.
187 | - Português (Brasil)
Posso comer vidro, não me machuca.
188 | - Français
Je peux manger du verre, ça ne me fait pas mal.
189 | - Deutsch
Ich kann Glas essen, ohne mir zu schaden.
190 | - Italiano
Posso mangiare il vetro e non mi fa male.
191 | - Русский
Я могу есть стекло, оно мне не вредит.
192 |
193 | - 汉语(简体中文)
我能吞下玻璃而不伤身体。
194 | - 漢語(繁體中文)
我能吞下玻璃而不傷身體。
195 | - 漢語(傳統字形)
我能吞下玻璃而不傷身體。
196 | - 日本語
私はガラスを食べられます。それは私を傷つけません。
197 | - 한국어
나는 유리를 먹을 수 있어요. 그래도 아프지 않아요.
198 |
199 |
200 |
201 |
202 |
203 |
--------------------------------------------------------------------------------
/preview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/preview.png
--------------------------------------------------------------------------------
/round.py:
--------------------------------------------------------------------------------
1 | import json
2 | import sys
3 | import math
4 | import cmath
5 |
6 | samePointThreshold = 3
7 |
8 | outerRadii = { 200: 30, 300: 45, 400: 60, 500: 75, 600: 90, 700: 105, 800: 120 }
9 | innerRadii = { 200: 5, 300: 5, 400: 5, 500: 5, 600: 5, 700: 5, 800: 5 }
10 |
11 | def ComplexVector(point1, point2):
12 | return complex(point2['x'] - point1['x'], point2['y'] - point1['y'])
13 |
14 | def Distance(point1, point2):
15 | return abs(ComplexVector(point1, point2))
16 |
17 | def Dot(cVec1, cVec2):
18 | return cVec1.real * cVec2.real + cVec1.imag * cVec2.imag
19 |
20 | def Get(contour, index, advance = 0):
21 | index += advance
22 | return contour[index % len(contour)]
23 |
24 | def Del(contour, index, advance = 0):
25 | if len(contour) == 0:
26 | return
27 | index += advance
28 | del contour[index % len(contour)]
29 |
30 | def InClosedInterval(x, a, b):
31 | return x >= a and x <= b
32 |
33 | def MergeNearPoints(contour, threshold = samePointThreshold):
34 | # do merge until nothing to merge
35 | merged = True
36 | while merged:
37 | merged = False
38 | i = 0
39 | while i < len(contour):
40 | this = Get(contour, i)
41 | next1 = Get(contour, i, 1)
42 | next2 = Get(contour, i, 2)
43 |
44 | if this['on'] and this == next2:
45 | merged = True
46 | Del(contour, i, 1)
47 | Del(contour, i)
48 | continue
49 |
50 | thisToNext = ComplexVector(this, next1)
51 | if abs(thisToNext) >= threshold:
52 | i += 1
53 | continue
54 |
55 | merged = True
56 | # they are equal, merge to center
57 | if this['on'] == next1['on']:
58 | next1['x'] = (this['x'] + next1['x']) / 2
59 | next1['y'] = (this['y'] + next1['y']) / 2
60 | Del(contour, i)
61 | # this one is more important
62 | elif this['on']:
63 | Del(contour, i, 1)
64 | # next one is more important
65 | else:
66 | Del(contour, i)
67 |
68 | def MergeAlmostCollinear(contour, tolerance = math.pi / 60, shortEdgeLimit = 90):
69 | # do merge until nothing to merge
70 | merged = True
71 | while merged:
72 | merged = False
73 | i = 0
74 |
75 | while i < len(contour):
76 | prev = Get(contour, i, -1)
77 | this = Get(contour, i)
78 | next1 = Get(contour, i, 1)
79 |
80 | # 3 conditons that cannot be merged
81 | # on -- on -- off (and symmetric)
82 | # off -- off -- off
83 | if (this['on'] and prev['on'] != next1['on']) or (not prev['on'] and not this['on'] and not next1['on']):
84 | i += 1
85 | continue
86 |
87 | prevToThis = ComplexVector(prev, this)
88 | thisToNext = ComplexVector(this, next1)
89 |
90 | # off -- on -- off, but can not be merged
91 | if (not prev['on'] and this['on'] and not next1['on']) and abs(prevToThis - thisToNext) > samePointThreshold:
92 | i += 1
93 | continue
94 |
95 | # more tolerant for short edge
96 | minEdge = min(abs(prevToThis), abs(thisToNext))
97 | threshold = tolerance if minEdge >= shortEdgeLimit else math.atan(math.tan(tolerance) * shortEdgeLimit / minEdge)
98 |
99 | if abs(cmath.phase(thisToNext / prevToThis)) > threshold:
100 | i += 1
101 | continue
102 |
103 | merged = True
104 |
105 | # 3 conditions that can be simply merged
106 | # off -- on -- off
107 | # on -- on -- on
108 | # on -- off -- on
109 | if (this['on'] and prev['on'] == next1['on']) or (prev['on'] and not this['on'] and next1['on']):
110 | Del(contour, i)
111 |
112 | # 2 conditions that need to insert an on-curve point
113 | # on -- off --(insert here)-- off (and symmetric)
114 | else:
115 | this['on'] = True
116 | if prev['on']:
117 | this['x'] = (this['x'] + next1['x']) / 2
118 | this['y'] = (this['y'] + next1['y']) / 2
119 | else:
120 | this['x'] = (this['x'] + prev['x']) / 2
121 | this['y'] = (this['y'] + prev['y']) / 2
122 | i += 1
123 |
124 | def NormalizeStrokeEnds(contour, tolerance = math.pi / 12, maxDistance = 90):
125 | i = 0
126 | while i < len(contour):
127 | if len(contour) < 4:
128 | return
129 |
130 | prev2 = Get(contour, i, -2)
131 | prev = Get(contour, i, -1)
132 | this = Get(contour, i)
133 | next1 = Get(contour, i, 1)
134 | next2 = Get(contour, i, 2)
135 | next3 = Get(contour, i, 3)
136 |
137 | # no off-curve point on the end
138 | if this['on'] and next1['on']:
139 | prevToThis = ComplexVector(prev, this)
140 | thisToNext = ComplexVector(next1, next2)
141 | end = ComplexVector(this, next1)
142 | angle1 = cmath.phase(end / prevToThis)
143 | angle2 = cmath.phase(thisToNext / end)
144 |
145 | minEdge = min(abs(prevToThis), abs(thisToNext))
146 | threshold = tolerance if minEdge >= maxDistance else math.atan(math.tan(tolerance) * maxDistance / minEdge)
147 | # they are outer conner, and they are close enough, and the 2 edges are almost parallel
148 | if angle1 < -math.pi / 4 and angle2 < -math.pi / 4 and abs(cmath.phase(-prevToThis) - cmath.phase(thisToNext)) < threshold and abs(end) * math.sin(-angle1) < 1.5 * maxDistance:
149 | # print (contour)
150 | this['x'] += abs(end) / 2 * math.cos(angle1) * math.cos(cmath.phase(prevToThis))
151 | this['y'] += abs(end) / 2 * math.cos(angle1) * math.sin(cmath.phase(prevToThis))
152 | next1['x'] -= abs(end) / 2 * math.cos(angle2) * math.cos(cmath.phase(thisToNext))
153 | next1['y'] -= abs(end) / 2 * math.cos(angle2) * math.sin(cmath.phase(thisToNext))
154 |
155 | prev2ToPrev = ComplexVector(prev2, prev)
156 | nextToNext2 = ComplexVector(next2, next3)
157 |
158 | if Distance(this, prev) < maxDistance and abs(cmath.phase(prevToThis / prev2ToPrev)) < tolerance:
159 | Del(contour, i, -1)
160 | i -= 1
161 | if Distance(next1, next2) < maxDistance and abs(cmath.phase(nextToNext2 / thisToNext)) < tolerance:
162 | Del(contour, i, 2)
163 | i -= 1
164 | i += 1
165 |
166 | # round conners of a glyph, assume outer outline is clockwise and inner outline in anti-clockwise
167 | def RoundGlyph(glyph, outerRadius, innerRadius):
168 | if 'contours' not in glyph:
169 | return
170 |
171 | for contour in glyph['contours']:
172 | MergeNearPoints(contour)
173 | MergeAlmostCollinear(contour)
174 | NormalizeStrokeEnds(contour, maxDistance = outerRadius)
175 | MergeAlmostCollinear(contour)
176 |
177 | i = 0
178 | while i < len(contour):
179 |
180 | this = Get(contour, i)
181 | # control point, pass
182 | if not this['on']:
183 | i += 1
184 | continue
185 |
186 | prev = Get(contour, i, -1)
187 | next1 = Get(contour, i, 1)
188 | next2 = Get(contour, i, 2)
189 | prevToThis = ComplexVector(prev, this)
190 | thisToNext = ComplexVector(this, next1)
191 |
192 | angle = cmath.phase(thisToNext / prevToThis)
193 | isCollinear = abs(angle) < math.pi / 180
194 |
195 | # curve point or tangent point, pass
196 | if isCollinear:
197 | i += 1
198 | continue
199 |
200 | # conner point:
201 | if angle > math.pi / 2:
202 | radius = innerRadius
203 | elif angle > 0:
204 | radius = outerRadius / 2 - angle / math.pi * (outerRadius - 2 * innerRadius)
205 | else:
206 | radius = outerRadius / 2 - angle / math.pi * outerRadius
207 |
208 | # change this connor point to control point
209 | this['on'] = False
210 |
211 | if i != 0:
212 | # decrease radius if no space for radius
213 | radius1 = abs(prevToThis) if abs(prevToThis) < radius else radius
214 | pointToInsert = {
215 | 'x': this['x'] - radius1 * math.cos(cmath.phase(prevToThis)),
216 | 'y': this['y'] - radius1 * math.sin(cmath.phase(prevToThis)),
217 | 'on': True}
218 |
219 | if Distance(prev, pointToInsert) > samePointThreshold:
220 | contour.insert(i, pointToInsert)
221 | i += 1
222 | # special for the first point
223 | else:
224 | prev2 = Get(contour, 0, -2)
225 | isPrevOuter = prev['on'] and cmath.phase(prevToThis / ComplexVector(prev2, prev)) < -math.pi / 180
226 | isPrevInner = prev['on'] and cmath.phase(prevToThis / ComplexVector(prev2, prev)) > math.pi / 180
227 |
228 | radius1 = radius
229 | if isPrevOuter:
230 | radius1 = abs(prevToThis) / 2 if radius1 > abs(prevToThis) / 2 else radius1
231 | elif isPrevInner:
232 | radius1 = abs(prevToThis) - innerRadius if radius1 + innerRadius > abs(prevToThis) else radius1
233 | else:
234 | radius1 = abs(prevToThis) if radius1 > abs(prevToThis) else radius1
235 | pointToInsert = {
236 | 'x': this['x'] - radius1 * math.cos(cmath.phase(prevToThis)),
237 | 'y': this['y'] - radius1 * math.sin(cmath.phase(prevToThis)),
238 | 'on': True}
239 |
240 | if Distance(prev, pointToInsert) > samePointThreshold and Distance(this, pointToInsert) > samePointThreshold:
241 | contour.insert(i, pointToInsert)
242 | i += 1
243 |
244 | isNextOuter = next1['on'] and cmath.phase(ComplexVector(next1, next2) / thisToNext) < -math.pi / 180
245 | isNextInner = next1['on'] and cmath.phase(ComplexVector(next1, next2) / thisToNext) > math.pi / 180
246 |
247 | radius2 = radius
248 | if isNextOuter:
249 | radius2 = abs(thisToNext) / 2 if radius2 > abs(thisToNext) / 2 else radius2
250 | elif isNextInner:
251 | radius2 = abs(thisToNext) - innerRadius if radius2 + innerRadius > abs(thisToNext) else radius2
252 | else:
253 | radius2 = abs(thisToNext) if radius2 > abs(thisToNext) else radius2
254 | pointToInsert = {
255 | 'x': this['x'] + radius2 * math.cos(cmath.phase(thisToNext)),
256 | 'y': this['y'] + radius2 * math.sin(cmath.phase(thisToNext)),
257 | 'on': True}
258 |
259 | if Distance(pointToInsert, next1) > samePointThreshold and Distance(this, pointToInsert) > samePointThreshold:
260 | contour.insert(i + 1, pointToInsert)
261 | i += 1
262 |
263 | i += 1
264 |
265 | MergeNearPoints(contour)
266 |
267 |
268 | if __name__ == '__main__':
269 | param = sys.argv[1]
270 | param = json.loads(param)
271 | weight = param["weight"]
272 |
273 | baseFont = json.load(sys.stdin)
274 |
275 | for (_, glyph) in baseFont['glyf'].items():
276 | RoundGlyph(glyph, outerRadii[weight], innerRadii[weight])
277 |
278 | outStr = json.dumps(baseFont, ensure_ascii=False, separators=(',', ':'))
279 | sys.stdout.write(outStr)
280 |
--------------------------------------------------------------------------------
/set-encoding.py:
--------------------------------------------------------------------------------
1 | import sys
2 | import json
3 | import codecs
4 | import configure
5 |
6 | if __name__ == '__main__':
7 | param = sys.argv[1]
8 | param = json.loads(param)
9 |
10 | dep = {**param, "encoding": "unspec"}
11 |
12 | with open("build/nowar/{}.otd".format(configure.GenerateFilename(dep)), 'rb') as baseFile:
13 | baseFont = json.loads(
14 | baseFile.read().decode('UTF-8', errors='replace'))
15 |
16 | baseFont['OS_2']['ulCodePageRange1'][param["encoding"]] = True
17 |
18 | outStr = json.dumps(baseFont, ensure_ascii=False, separators=(',', ':'))
19 | with codecs.open("build/nowar/{}.otd".format(configure.GenerateFilename(param)), 'w', 'UTF-8') as outFile:
20 | outFile.write(outStr)
21 |
--------------------------------------------------------------------------------
/source/noto/NotoSans-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-Bold.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-Condensed.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-Condensed.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-CondensedBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-CondensedBold.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-CondensedLight.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-CondensedLight.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-CondensedMedium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-CondensedMedium.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-Light.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-Light.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-Medium.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-Regular.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-SemiCondensed.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-SemiCondensed.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-SemiCondensedBold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-SemiCondensedBold.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-SemiCondensedLight.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-SemiCondensedLight.ttf
--------------------------------------------------------------------------------
/source/noto/NotoSans-SemiCondensedMedium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/noto/NotoSans-SemiCondensedMedium.ttf
--------------------------------------------------------------------------------
/source/rhr/placeholder:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nowar-fonts/Nowar-Rounded/5f39d5ced7eae831b5edacfe9e3c21beb1b56459/source/rhr/placeholder
--------------------------------------------------------------------------------