├── .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 | ![有爱圆体](poster/heading.png) 12 | 13 | ![多语言支持](poster/multilingual.png) 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 | ![有愛圓體](poster/heading.png) 12 | 13 | ![多語言支援](poster/multilingual.png) 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 | ![Nowar Rounded](poster/heading.png) 12 | 13 | ![Multilingual support](poster/multilingual.png) 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 --------------------------------------------------------------------------------