Noto fonts go universal! Download Noto fonts combined to suit your region (South Asia, SE Asia, Africa-MiddleEast, Europe-Americas).

Overview

Go Noto Universal

Noto fonts go universal! Download Noto fonts combined to suit your region (South Asia, SE Asia, East Asia, Africa-MiddleEast, Europe-Americas).

This software combines/merges multiple Noto Fonts to a single, region-specific font.

Download

If you simply want to use the fonts, go to Releases page and download what you need.

Development builds are available from GitHub Actions page. Click on any workflow with green checkmark (pipeline passed) and under "Artifacts", download "GoNotoUniversal.zip" (login required).

Build

If you want to build the fonts yourself, create a virtual environment (venv) and call ./run.sh.

python3 -m venv venv_fonty
source venv_fonty/bin/activate
./run.sh
deactivate

Font generation can take 10 to 20 min, depending on your computer's capabilities.

run.sh is designed to be reentrant, so you can run it multiple times without altering the working state of the repository or downloading stuff again and again.

Latest CI status:

CI

Dependencies

There is no dependency other than nototools and fonttools. Both are automatically fetched and used.

Coverage

Fonts are merged/combined as per the regions defined in the Unicode Standard (pdf). Chapter numbers below refer to that spec.

Regional font Coverage
GoNotoEuropeAmericas.ttf "Europe" - ch. 7, 8, "Americas" - ch 20, "Notational Systems" - ch 21
GoNotoAfricaMiddleEast.ttf "Middle East" - ch. 9, 10, 11 and "Africa" - ch. 19
GoNotoSouthAsia.ttf "South and Central Asia" - ch. 12 and 13
GoNotoAsiaHistorical.ttf "South and Central Asia" - ch. 14 and 15
GoNotoSouthEastAsia.ttf "Southeast Asia" - ch. 16 and "Indonesia and Ocenia" - ch 17
GoNotoCJKCore2005.ttf Unihan IICore subset of CJK (~10K ideographs). Use Noto CJK for full coverage
GoNotoEastAsia.ttf "East Asia" - ch 18. everything other than Han (CJK)

Each of the above fonts includes LGC (Latin-Greek-Cyrillic) as default, same coverage as Noto Sans Regular. Each one also includes Noto Sans Math, Noto Music, Noto Sans Symbols and Noto Sans Symbols 2 to give you bonus coverage of beautiful notations, symbols and emoji :)

Go Noto South Asia

Following are included: Devanagari (Hindi, Marathi, Nepali, etc), Bengali, Punjabi (Gurmukhi), Gujarati, Oriya, Tamil, Telugu, Kannada, Malayalam, Thaana, Sinhala, Newa, Tibetan, Limbu, Meetei Mayek, Mro, Warang Citi, Ol Chiki, Chakma, Lepcha, Saurashtra, Masaram Gondi, Gunjala Gondi, Wancho.

Urdu (NotoNastaliq), though not written in an Indic script and not part of "South Asia" chapters in the Unicode spec, is included for practical reasons. Mongolian is currently not included because of issue with vmtx (vertical metrics). Noto fonts do not exist for Toto and Tangsa.

Go Noto Asia Historical

Following are included: Brahmi, Kharoshthi, Bhaiksuki, Phags-Pa, Marchen, Zanabazar Square, Soyombo, Old Turkic, Old Sogdian, Sogdian, Old Uyghur, Indic Siyaq Numbers, Syloti Nagri, Kaithi, Sharada, Takri, Siddham, Mahajani, Khojki, Khudawadi, Multani, Tirhuta, Modi, Grantha, Ahom, Sora Sompeng, Dogra.

Noto fonts do not exist for Dives Akuru and Ottoman Siyaq Numbers.

Go Noto South East Asia

Following are included: Thai, Lao, Myanmar, Khmer, Tai Le, New Tai Lue, Tai Tham, Tai Viet, Kayah Li, Cham, Pahawh Hmong, Nyiakeng Puache Hmong, Pau Cin Hau, Hanifi Rohingya, Tagalog, Hanunoo, Buhid, Tagbanwa, Buginese, Balinese, Javanese, Sundanese, Rejang, Batak.

Noto fonts do not exist for Makasar.

Go Noto Europe Americas

Everything covered by NotoSans (Latin-Greek-Cyrillic etc.) plus Armenian, Coptic, Cypriot, Georgian, Deseret, Glagolitic, Osage, Old Italic, Runic, Duployan, Anatolian Hieroglyphics, Carian, Canadian Aboriginal, Cherokee, Lycian, Lydian, Mayan Numerals, Nyiakeng Puachue Hmong, Old Hungarian, Gothic, Elbasan, Caucasian Albanian, Vithkuqi, Ogham, Old Permic, Shavian, Sutton Sign Writing, Linear A and Linear B.

Go Noto Africa Middle East

The following are included: Arabic (Naskh-style), Adlam, Avestan, Bamum, Bassa Vah, Cuneiform, Hebrew, Syriac, Samaritan, Mandaic, Yezidi, Old North Arabian, Old South Arabian, Phoenician, Imperial Aramaic, Manichaean, Inscriptional Parthian, Inscriptional Pahlavi, Psalter Pahlavi, Elymaic, Nabataean, Palmyrene, Hatran, Ugaritic, Old Persian, Egyptian, Meroitic, Anatolian Hieroglyphics.

Noto fonts do not exist for Chorasmian.

Go Noto East Asia

Tibetan, Lisu, Marchen, Miao, Yi, etc. excluding Han/CJK (Chinese-Japanese-Korean).

Mongolian, Nüshu and Tangut could not be included.

Go Noto CJK Core 2005

Unihan IICore is a minimal, region-agnostic subset of Han/CJK specified in 2005 for memory-constrained systems. It standardizes about 9800 codepoints, covering basic use cases of Chinese (Traditional, Simplified), Japanese and Korean. Recently Unihan Core 2020 superseded and expanded the minimal subset to about 20000 codepoints.

The GoNotoCJKCore2005 includes "locl" features, so it can display Japanese or Korean glyphs just by switching the language in your editor/word processor/web browser etc.

The generated font does not contain Noto Sans Math, Noto Music, Noto Sans Symbols, Noto Sans Symbols 2 because fonttools does not support merging fonts with CFF outlines (which is the case for .otf). Converting .otf to .ttf still doesn't solve the problem because CJK fonts have "vmtx" table, which is absent in other fonts, thus preventing pyftmerge.

Font Statistics

Statistics below correspond to release v3.0.

Regional font Code blocks Codepoints Glyphs
GoNotoEuropeAmericas.ttf 120 13389 53570
GoNotoAfricaMiddleEast.ttf 128 16053 20329
GoNotoSouthAsia.ttf 117 11502 21553
GoNotoAsiaHistorical.ttf 122 11001 18248
GoNotoSouthEastAsia.ttf 111 10786 15013
GoNotoEastAsia.ttf 109 18708 25043
GoNotoCJKCore2005.ttf 20 10338 20099

NotoSansSignWriting alone contributes about 37900 glyphs to GoNotoEuropeAmericas.ttf.

Note that each of the above (except CJKCore2005) include statistics of:

Upstream font Code blocks Codepoints Glyphs
Noto Sans 37 2840 3317
Noto Sans Math 22 2472 2655
Noto Music 7 559 579
Noto Sans Symbols 15 840 1218
Noto Sans Symbols 2 37 2655 2674
Total 111 8807 9864

Caveats

  1. You might have to increase line spacing or line margins in your application to avoid some characters appearing "clipped". This is because many Asian scripts stack letters vertically (e.g. Indic scripts, Thai, Balinese etc.) but the line metrics of the merged font are optimized for LGC.
  2. Tibetan has limited glyphs, otherwise GSUB table gets "overflow"ed. Only the most frequently occuring "subjoined consonants" are included. Those characters are displayed ok, but just that the glyphs appear to be "pushed up" compared to their neighbours.
  3. Vertical text layout is not supported for Dogra, Mongolian, Nandinagari, Nüshu and Tangut, even though the upstream Noto fonts has the support because fonttools does not support merging with vmtx/vhea.
  4. GoNotoCJKCore2005 does not contain Noto Sans Math and Noto Sans Symbols because fonttools does not support merging CFF with others.

License

In the spirit of loka-saṃgraha, the scripts distributed in this git repository (the "Software") are dedicated to the public domain as per "The Unlicense". See UNLICENSE.txt.

However, the fonts generated by using the Software are licensed under the SIL Open Font License, Version 1.1, as required by the upstream Noto Fonts Project.

Others

FontTools package comes with nice utilities ttx (ttf to xml and back), pyftsubset (create font with subset of given font) and pyftmerge (merging fonts, basically same as this repo).

otfinfo gives useful info about glyphs, codepoints, scripts and more.

Comments
  • Noto Sans Nandinagari Regular could not be merged

    Noto Sans Nandinagari Regular could not be merged

    Currently fonttools doesn't support merging when one of the inputs has different tables not present in the other. In the following example, NotoSans-Regular doesn't have vmtx.

    pyftmerge --verbose NotoSansNandinagari-Regular.ttf  NotoSans-Regular.ttf
    Merging 'cmap'.
    Merged 'cmap'.
    Merging 'GSUB'.
    Merged 'GSUB'.
    Merging 'GDEF'.
    Merged 'GDEF'.
    Merging 'head'.
    Merged 'head'.
    Merging 'cvt '.
    Merged 'cvt '.
    Merging 'gasp'.
    Merged 'gasp'.
    Merging 'DSIG'.
    Don't know how to merge 'DSIG'.
    Dropped 'DSIG'.
    Merging 'loca'.
    Merging 'vmtx'.
    Traceback (most recent call last):
      File "/home/ubuntu/projects/go-noto-universal/venv_fonty/bin/pyftmerge", line 8, in <module>
        sys.exit(main())
      File "/home/ubuntu/projects/go-noto-universal/venv_fonty/lib/python3.8/site-packages/fontTools/misc/loggingTools.py", line 372, in wrapper
        return func(*args, **kwds)
      File "/home/ubuntu/projects/go-noto-universal/venv_fonty/lib/python3.8/site-packages/fontTools/merge.py", line 1276, in main
        font = merger.merge(fontfiles)
      File "/home/ubuntu/projects/go-noto-universal/venv_fonty/lib/python3.8/site-packages/fontTools/merge.py", line 1097, in merge
        table = clazz(tag).merge(self, tables)
      File "/home/ubuntu/projects/go-noto-universal/venv_fonty/lib/python3.8/site-packages/fontTools/merge.py", line 156, in merge
        return m.mergeObjects(self, self.mergeMap, tables)
      File "/home/ubuntu/projects/go-noto-universal/venv_fonty/lib/python3.8/site-packages/fontTools/merge.py", line 1154, in mergeObjects
        value = mergeLogic(getattr(table, key, NotImplemented) for table in tables)
      File "/home/ubuntu/projects/go-noto-universal/venv_fonty/lib/python3.8/site-packages/fontTools/merge.py", line 88, in sumDicts
        d.update(item)
    TypeError: 'NotImplementedType' object is not iterable
    

    Above is with fonttools 4.28.3

    opened by satbyy 6
  • cmap overflow? cannot merge CJK with GoNotoContemporary.ttf

    cmap overflow? cannot merge CJK with GoNotoContemporary.ttf

    Latest CI builds create GoNotoContemporary.ttf which is a superset of all regional fonts (Asia + Africa + Europe + Americas), excluding historical scripts (and sign-writing). The only missing region is East Asia, aka CJK.

    It has plenty of room for expansion, as of now it encompasses 11706 codepoints and 34256 glyphs.

    otfinfo -u GoNotoContemporary.ttf | wc -l
    11706
    otfinfo -g GoNotoContemporary.ttf | wc -l
    34256
    

    So there is space for at least (65K - 34K) ~ 30K glyphs before we max out the 65535 glyph limit.

    We also generate GoNotoCJKCore.otf which has about 10K code points and 20K glyphs, so it should all nicely fit-in the same font.

    However, the idea fails because cmap table format 4 hits the 65535 limit.

    otf2ttf GoNotoCJKCore2005.otf
    pyftmerge --verbose --drop-tables+=vmtx,vhea GoNotoContemporary.ttf GoNotoCJKCore2005.ttf
    # ... 
    File "/home/ubuntu/projects/go-noto-universal/venv_fonty/lib/python3.8/site-packages/fontTools/ttLib/tables/_c_m_a_p.py", line 172, in compile
        chunk = table.compile(ttFont)
      File "/home/ubuntu/projects/go-noto-universal/venv_fonty/lib/python3.8/site-packages/fontTools/ttLib/tables/_c_m_a_p.py", line 904, in compile
        header = struct.pack(cmap_format_4_format, self.format, length, self.language,
    struct.error: 'H' format requires 0 <= number <= 65535
    

    The actual length is about 66600, so just a little over 65K. The aim of this issue/ticket is to figure out a way to overcome the cmap limit.

    What is strange is that the original, non-subsetted CJK font itself has cmap length about 40K but the subsetted CJK has 51K cmap length!

    A brute-force way I found is to use --no-layout-closure while subsetting, but it also removes locl feature, so JP or KR cannot use a CN font.

    opened by satbyy 4
  • Mark classes and mark sets are not merged correctly

    Mark classes and mark sets are not merged correctly

    Fonts with lookups that use mark classes or mark sets are not merged correctly. If, say, a lookup in a source font uses mark set 0, the corresponding lookup in the merged font will also use mark set 0, even though the merged font’s mark set 0 might come from a different source font.

    For example, here is <U+11C72, U+11C92, U+11C93> in Go Noto East Asia: 𑱲𑲒𑲓 And here it is in Noto Sans Marchen: 𑱲𑲒𑲓

    bug 
    opened by dscorbett 2
  • Add more CJK-related blocks

    Add more CJK-related blocks

    • Remove duplicated NotoSans-Regular which was mistakenly included twice. This frees up about 3300 glyphs
    • Add more CJK-related blocks: CJK Symbols and Punctuation, Bopomofo, Bopomofo Extended, Halfwidth & Fullwidth Forms, CJK Strokes, CJK compatibility, CJK compatibilty forms, Enclosed CJK letters and months, Enclosed ideographic supplement, Katakana phonetic extensions
    • Remove layout features related to vertical writing (vert, vkrn, vrt2, vhal, vpal, etc.)
    • Move Cypriot and Glagolitic to "Go Noto Ancient"
    opened by satbyy 1
  • Require `fonttools >= 4.28.4`

    Require `fonttools >= 4.28.4`

    Fixes #3. It doesn’t make any difference for continuous integration, because that always starts from scratch, but this is necessary if you already have a virtual environment with an older fontTools.

    opened by dscorbett 1
  • Include all Tibetan code points

    Include all Tibetan code points

    Noto Serif Tibetan includes a lot of unnecessary glyphs for conjuncts. Filtering them out makes a subset that covers all Tibetan code points while still fitting within the merged fonts.

    opened by dscorbett 1
  • Switch to migrated website/URLs of Noto fonts

    Switch to migrated website/URLs of Noto fonts

    Instead of delivering all fonts from single repo 1, upstream Google has decided to create separate git repo for each font. A web frontend with new development builds is available 2 but it is not all fonts are there yet.

    opened by satbyy 0
  • Go Noto Universal line spacing error

    Go Noto Universal line spacing error

    Hi, I think there is an error in line spacing in Go Noto Universal - it is unnaturally big. When I compare it to other fonts and even to NotoSansRegular.ttf (https://github.com/googlefonts/noto-fonts/tree/main/hinted/ttf/NotoSans/NotoSans-Regular.ttf) so the file that is taken to build latin fonts in go-noto-universal. In the picture attached I show the comparison of Line Spacing in MS Word of NotoSansRegular and GoNotoCurrent.ttf: Comparison It is not only the case of MS Word, I checked that in Linux in other programs, there is also unnaturally big line spacing. It makes very uncomfortable to use this font and espacially in programs where I am not able to change it manually.

    opened by skipperon 3
  • Why does GoNotoCurrent not render Korean glyphs whereas GoNotoCJKCore does?

    Why does GoNotoCurrent not render Korean glyphs whereas GoNotoCJKCore does?

    Thank you for providing this great library! I am currently trying to render text in various languages with the pygame library and it seems that when I am using GoNotoCurrent, I can render Japanese and Chinese glyphs just fine, but Korean glyphs are only rendered as empty boxes. When I am using GoNotoCJKCore, Korean is rendered properly as well, so I am wondering what the main difference between the two is. I can get around the issue by rendering my texts with the Pillow library and a libraqm layout engine which builds on harfbuzz, but this is horribly slow, so I'd prefer to keep using pygame and get it to work with GoNotoCurrent. Do you have an idea why rendering Korean might not work in my setup?

    bug workaround available 
    opened by xplip 7
  • Request for other weight

    Request for other weight

    I used "GoNotoSouthEastAsia" with in Thai. That work perfectly but I can't find other weight like Thin, Semi Bold, Bold, ect. can you add other weight or how to compile it. that would be great.

    thank you for build this project.

    enhancement 
    opened by podhikaru 1
Releases(v5.2)
Owner
Satish B
Satish B
Libretrofuzz - Fuzzy Retroarch thumbnail downloader

Fuzzy Retroarch thumbnail downloader In Retroarch, when you use the manual scann

8 Nov 26, 2022
the best video downloader for terminals (currently only compatible with Linux and Windows)

the best video downloader for terminals (currently only compatible with Linux and Windows)

Amaral 2 Oct 14, 2021
Download history data from binance and save to dataframe or csv file

Binance history data downloader Download history data from binance and save to dataframe or csv file

10 Dec 02, 2022
Youtube Downloader is a simple but highly efficient Youtube Video Downloader, made completly using Python

Youtube Downloader is a simple but highly efficient Youtube Video Downloader, made completly using Python

Arsh 2 Nov 26, 2022
Itchio Downloader Tool with python

Itchio Downloader Tool Install pip install git+https://github.com/emersont1/itchio Download All Games in library from account python -m itchio.downloa

Peter Taylor 69 Dec 05, 2022
Um projeto modesto para baixar vídeos do youtube usando tkinter como gui

Youtube Downloader Um projeto modesto para baixar vídeos do youtube usando tkinter como gui Instalação dos requirements: python3 setup.py ou python se

Sunlyx 2 Nov 25, 2021
Shit-fetch - Shitpost fetcher (downloader)

shit-fetch Download shitpost (random) from https://random-shitpost.com/ Usage ./shitfetch.py --nsfw (true/false) --output ~/Downloads (default : ./)

Pinokaille 1 Jan 02, 2022
PyQt5 simple files , youtube videos and youtube playlist downloader

PyQt5 simple files , youtube videos and youtube playlist downloader

AmirHossein Mohammadi 7 Jul 25, 2022
Youtube_dl_helper - A hacky python script meant to automate the process of downloading mp3 files from YouTube using youtube-dl library

youtube_dl_helper A helper program meant to automate the process of downloading mp3 files from YouTube using youtube-dl library Dependencies In order

Guilherme Bittencourt de Borba 1 Jan 04, 2022
Scripts to download files and folders programmatically from Google Drive

Google Drive Downloader Scripts Every time I need to download a lot of files from Google Drive (e.g. a dataset), it's always incredibly frustrating an

Ivan Evtimov 6 Jul 22, 2021
A modern CLI to download animes automatically from Twist

Kurby Kurby is a nice and simple CLI that use Twist website, and their huge collection to download animes for free and automatically Animes from Twist

Alain BERRIER 48 Dec 22, 2022
A Celery application to collect data, download media and extract information from social media APIs

Project IBEX A Celery application to collect data, download media and extract information from social media APIs. Requirements You must have a Redis D

ibex 4 Dec 15, 2022
Code for "Adversarial Motion Priors Make Good Substitutes for Complex Reward Functions"

Adversarial Motion Priors Make Good Substitutes for Complex Reward Functions Codebase for the "Adversarial Motion Priors Make Good Substitutes for Com

Alejandro Escontrela 54 Dec 13, 2022
抖音去水印视频批量下载,完全使用抖音官方接口

TikTokDownload 抖音去水印视频下载,使用抖音官方接口 使用教程(Win7) Win10环境暂时没测,bug情况应该比Win7少 运行软件前先打开目录下 conf.ini 文件按照要求进行配置 批量下载可直接修改配置文件,单一视频下载请直接打开粘贴视频链接即可

JohnserfSeed 2k Jan 04, 2023
Python script for downloading audio from YouTube songs/videos.

Python script for downloading audio from YouTube songs/videos. All you have to do is specify the path to your folder and then type song's/video's name and the sound will be downloaded into your folde

Mateusz Polis 0 Oct 05, 2022
A youtube-dl fork with additional features and fixes

yt-dlp is a youtube-dl fork based on the now inactive youtube-dlc. The main focus of this project is adding new features and patches while also keepin

yt-dlp 37.1k Jan 03, 2023
Python software to download videos from Tiktok without rights

download-video-tiktok Python software to download videos from Tiktok without rights to install pip install requests Follow us telegram : https://t.me

muntazir halim 1 Oct 28, 2021
A downloader for Cave Story written in Python

Cave Story Downloader This is a downloader for Cave Story written in Python. Thi

Imsad2 2 Feb 16, 2022
A scriptable music downloader for Qobuz, Tidal, and Deezer

streamrip A scriptable stream downloader for Qobuz, Tidal, and Deezer. Features Downloads tracks, albums, playlists, discographies, and labels from Qo

967 Jan 03, 2023
Downloads data from OSM API and uploads it to the mapping sandbox.

OpenStreetMap To Sandbox This is a script to download data from OSM API and upload it to the mapping sandbox. Note that it clears all data in the sand

Ilya Zverev 5 Nov 27, 2022