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
Pantheon - The fastest YouTube downloader.

A Youtube downloader written in Python3, using HTTP requests and an API.

Billy 38 Nov 21, 2022
This is a Text Data Analysis Project Involving (YouTube Case Study).

Text_Data_Analysis This is a Text Data Analysis Project Involving (YouTube Case Study). Problem Statement = Sentiment Analysis. Package1: There are m

1 Mar 05, 2022
This Program helps you download songs from the Spotify track's link you give in.

Spotify-Downloader-GUI This Program helps you download songs from the Spotify track's link you give in. It uses yt-dlp to download songs from Youtube.

Harish 12 Jun 14, 2022
Simple python script to download .mp3 formatted files from YouTube video URLs

Introduction: Simple python script to download .mp3 formatted files from YouTube video URLs Requirements: Requires: youtube_dl module Requires: ffmpeg

Pat 2 Aug 18, 2022
python code used to download all images contained in a facebook uid , the uid can be profile,group,fanpage

python code used to download all images contained in a facebook uid , the uid can be profile,group,fanpage

VVHai 2 Dec 21, 2021
A manga download script written in python.

manga-dlp python script to download mangas Description A manga download script written in python. It only supports mangadex.org for now. But support f

Ivan Schaller 15 Nov 28, 2022
Youtube Video Downloader Using Python Gui Appliction with progress Bar

Youtube-Video-Downloader Youtube Video Downloader Using Python Gui Appliction with progress Bar Module Used Pytube Tkinter Pil Urllib Bytes Io LICENSE

Community Programmer 6 Dec 19, 2022
File Downloader

File Downloader Watches a file containing download links and runs a command to download them. The link file is in form of: # comment DOWNLOAD_LINK

Pouriya 1 Jan 08, 2022
This script fully automates of downloading tiktok videos, editing them,compiling them and finally uploading them to youtube.

This script fully automates of downloading tiktok videos, editing them,compiling them and finally uploading them to youtube. If you wanted to create a tiktok video compiilation youtubbe channel this

Supriyo Sarkar 32 Dec 16, 2022
抖音批量下载助手

抖音批量下载助手

HuangSK 303 Jan 05, 2023
Desktop utility to download images/videos/music/text from various websites, and more

Desktop utility to download images/videos/music/text from various websites, and more

Kurt Bestor 11.2k Jan 08, 2023
ImageScraper is a cross-platform tool for downloading a specified count from xkcd, Astronomy Picture of the Day and Existential Comics

ImageScraper The ImageScraper is a cross-platform tool for downloading a specified count from xkcd, Astronomy Picture of the Day and Existential Comic

1amnobody 1 Jan 25, 2022
Easy automated ebook downloader using openbooks as the backend

Easy automated ebook downloader using openbooks as the backend

27 Nov 06, 2022
A simple contents download module using url for python

A simple contents download module using url for python

Fayas Noushad 16 Oct 20, 2022
Noto fonts go universal! Download Noto fonts combined to suit your region

noto-cjk Noto CJK fonts Noto Serif CJK update was released on 25 October 2021. We moved the release history and other notes into both Sans and Serif s

Google Fonts 2k Jan 02, 2023
Download YouTube videos that are available in the given playlist

Youtube-Playlist-Downloader Download YouTube videos that are in a playlist Project assets: music downloaded music folder. (will be generated) music.db

Sultan Aljaberi 1 Dec 22, 2021
Python-Youtube-Downloader - An Open Source Python Youtube Downloader

Python-Youtube-Downloader Hello There This Is An Open Source Python Youtube Down

Flex Tools 3 Jun 14, 2022
A cross-platform python based utility to download courses from udemy for personal offline use.

udemy-dl A cross-platform python based utility to download courses from udemy for personal offline use. Warning Udemy has started to encrypt many of t

Nasir Khan 4.6k Dec 31, 2022
Script for YouTube creators to share dislike count with their viewers.

Stahování disliků z YouTube - milafon Tento skript slouží jako možnost zobrazit divákům počet disliků u YouTube videí. Vyžaduje implementaci ze strany

4 Sep 28, 2022
Get the latest updates around you as they happen

Adherent We all are different, experience various things happening around us but we stick together. We are all a part of a greater community. As human

Shreyas Daniel 1 Nov 10, 2022