<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>fonts &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/fonts/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Sat, 04 Apr 2026 08:46:17 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>fonts &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Is Android Unicode Yet?]]></title>
		<link>https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/</link>
					<comments>https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 07 Oct 2024 11:34:10 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[google]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=53054</guid>

					<description><![CDATA[Google&#039;s Android platform has dreadful support for Unicode. Even the most recent Android versions are missing out on languages, characters, and symbols which were added to Unicode in the last decade.  Back in 2013, Google created the &#34;Noto&#34; project. Its aim? To include &#34;all the world&#039;s languages&#34;. They wanted to banish &#34;tofu&#34; - the little white blocks □ which indicate a missing character - hence t…]]></description>
										<content:encoded><![CDATA[<p>Google's Android platform has dreadful support for Unicode. Even the most recent Android versions are missing out on languages, characters, and symbols which were added to Unicode in the last <em>decade</em>.</p>

<p>Back in 2013, Google created the "Noto" project. Its aim? <a href="https://www.npr.org/sections/codeswitch/2014/08/03/337168933/-no-tofu-doesn-t-equate-to-no-problem-for-google-universal-typeface">To include "all the world's languages"</a>. They wanted to banish "tofu" - the little white blocks □ which indicate a missing character - hence the name "No Tofu" / "Noto".</p>

<p>There was great flurry and excitement which has, thankfully, been sustained over the years. Noto continues to churn out regular updates to their fonts. Android began to use Noto but, for some unknown reason, it only rarely uses the latest versions. This means whole swathes of modern characters are missing from Android.</p>

<p>You can see <a href="https://cs.android.com/android/platform/superproject/main/+/main:external/noto-fonts/;bpv=1">all the fonts included in the Android Open Source Project</a>. If you want to download them all, run: <code>git clone https://android.googlesource.com/platform/external/noto-fonts</code></p>

<p>Open up the fonts in your favourite editor, and you'll see just how outdated they are.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/09/Noto-Symbols-fs8.png" alt="Fontforge showing the version is from 2013." width="1221" height="546" class="aligncenter size-full wp-image-53076">

<p>For example, Gujarati is stuck on 2013's version (1.03) despite <a href="https://github.com/notofonts/gujarati/releases">v2.106 being released in 2023</a></p>

<p>It's a similar story for the technical symbols block - Android is stuck on v1.09 despite <a href="https://github.com/notofonts/symbols/releases">a decade of advances</a>.</p>

<p>A few, like <a href="https://github.com/notofonts/hentaigana">Hentaigana</a> were only created recently - and so are on the latest version. But the majority are woefully outdated.</p>

<p>Perhaps that's just a lack of love for AOSP? Not at all. I downloaded <a href="https://developer.android.com/about/versions/15/download">the latest beta version of Android 15</a> and went through all the fonts it included.  They're exactly the same<sup id="fnref:hebrew"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fn:hebrew" class="footnote-ref" title="Well, OK. For some reason the Pixel has an extremely outdated version of Hebrew and a slightly newer version of Color Emoji Flags." role="doc-noteref">0</a></sup>.</p>

<h2 id="how-bad-is-it"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#how-bad-is-it">How bad is it?</a></h2>

<p>I decided to compare all the recently published Noto fonts and those available in AOSP.</p>

<p>I <a href="https://github.com/notofonts/notofonts.github.io">downloaded all the most recent Noto fonts from GitHub</a>. It does take some time for fonts to be tested on phones so, in the spirit of fairness, I grabbed the 2024-01-01 release.</p>

<p>Here's what I found.</p>

<p>Of the 224 non-Emoji fonts in Noto, AOSP only has about 140. About a third are simply missing.</p>

<p>Of the fonts included with Android 15, how many were updated within the last 2 years?  <strong>Ten</strong>.  Not a typo.</p>

<p>Despite a regular publishing cadence from another Google project, Android is ignoring the vast majority of updates.</p>

<p>This means Android is missing entire languages, has severely outdated fonts in others, and - most importantly - <a href="https://unicodepowersymbol.com/">doesn't include the Unicode Power Symbol</a>.</p>

<p>Noto is a great effort - but Android is failing to keep up.</p>

<h2 id="what-now"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#what-now">What now?</a></h2>

<p>I've <a href="https://issuetracker.google.com/issues/366415133">raised a bug on the AOSP bug tracker</a><sup id="fnref:die"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fn:die" class="footnote-ref" title="Which is where all bug reports submitted by the public go to die." role="doc-noteref">1</a></sup>. And I've published this ranty blog post. If you work for Google, or an Android manufacturer, please give the Android team a nudge and get them to update.</p>

<p>Ideally, Project Treble would allow for these fonts to be updated, so even older versions of Android could benefit from them.</p>

<h2 id="full-list-of-fonts-dates-and-versions"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#full-list-of-fonts-dates-and-versions">Full List of Fonts, Dates, and Versions</a></h2>

<p>I've generated this based on the 2024-01-01 release of Noto and the AOSP source code from 2024-09-13.  I've placed the dates next to each other for ease of comparrison. Empty cells means the font doesn't exist in that release.</p>

<p>I've tried to transcribe all the data accurately. Corrections very much welcome.</p>

<table><thead>
  <tr>
    <th></th>
    <th colspan="2">Noto</th>
    <th colspan="2">AOSP</th>
  </tr>
  <tr>
    <td>Font Name</td>
    <td>Version</td>
    <td>Date</td>
    <td>Date</td>
    <td>Version</td>
  </tr>
</thead>
<tbody>

  <tr>
    <td>Noto Fangsong KSS Rotated Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Fangsong KSS Vertical Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Kufi Arabic Regular</td>
    <td>2.108</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Looped Thai Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Music Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Naskh Arabic Regular</td>
    <td>2.018</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.08</td>
  </tr>
  <tr>
    <td>Noto Naskh Arabic UI Regular</td>
    <td>2.014</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.08</td>
  </tr>
  <tr>
    <td>Noto Nastaliq Urdu Regular</td>
    <td>3.009</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Rashi Hebrew Regular</td>
    <td>1.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Regular</td>
    <td>2.013</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Adlam Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td>2019</td>
    <td>3</td>
  </tr>
  <tr>
    <td>Noto Sans Adlam Unjoined Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Anatolian Hieroglyphs Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Arabic Regular</td>
    <td>2.012</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Armenian Regular</td>
    <td>2.008</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.005</td>
  </tr>
  <tr>
    <td>Noto Sans Avestan Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Balinese Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Bamum Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Bassa Vah Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Batak Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Bengali Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Bengali UI Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Bhaiksuki Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Brahmi Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Buginese Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Buhid Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Canadian Aboriginal Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Carian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Caucasian Albanian Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Chakma Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Cham Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Cherokee Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2016</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Chorasmian Regular</td>
    <td>1.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Coptic Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Cuneiform Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Cypriot Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Cypro Minoan Regular</td>
    <td>1.503</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Deseret Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Devanagari Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2015</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Devanagari UI Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2015</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Duployan Regular</td>
    <td>3.001</td>
    <td>2019</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Egyptian Hieroglyphs Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Elbasan Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Elymaic Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Ethiopic Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td>2015</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Georgian Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Glagolitic Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Gothic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Grantha Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2020</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Gujarati Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Gujarati UI Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Gunjala Gondi Regular</td>
    <td>1.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Gurmukhi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Gurmukhi UI Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Hanifi Rohingya Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Hanunoo Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Hatran Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Hebrew Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2024</td>
    <td>3.001</td>
  </tr>
  <tr>
    <td>Noto Sans Imperial Aramaic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Indic Siyaq Numbers Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Inscriptional Pahlavi Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Inscriptional Parthian Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Javanese Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Kaithi Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Kannada Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2018</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Kannada UI Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.003</td>
  </tr>
  <tr>
    <td>Noto Sans Kawi Regular</td>
    <td>1</td>
    <td>2023</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Kayah Li Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Kharoshthi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Khmer Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2016</td>
    <td>1.901</td>
  </tr>
  <tr>
    <td>Noto Sans Khojki Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Khudawadi Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Lao Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Lao Looped Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Lepcha Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Limbu Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Linear A Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Linear B Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Lisu Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Lycian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Lydian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Mahajani Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Malayalam Regular</td>
    <td>2.104</td>
    <td>2022</td>
    <td>2018</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Malayalam UI Regular</td>
    <td>2.104</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.103</td>
  </tr>
  <tr>
    <td>Noto Sans Mandaic Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Manichaean Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Marchen Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Masaram Gondi Regular</td>
    <td>1.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Math Regular</td>
    <td>2.539</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Mayan Numerals Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Medefaidrin Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td>2020</td>
    <td>1.001</td>
  </tr>
  <tr>
    <td>Noto Sans Meetei Mayek Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Mende Kikakui Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Meroitic Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Miao Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Modi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2018</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Mongolian Regular</td>
    <td>3.001</td>
    <td>2023</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Mono Regular</td>
    <td>2.014</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Mro Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Multani Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Myanmar Regular</td>
    <td>2.107</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans NKo Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans NKo Unjoined Regular</td>
    <td>2.004</td>
    <td>2023</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nabataean Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nag Mundari Regular</td>
    <td>1</td>
    <td>2023</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nandinagari Regular</td>
    <td>1.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans New Tai Lue Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Newa Regular</td>
    <td>2.007</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Nushu Regular</td>
    <td>1.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Ogham Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Ol Chiki Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Old Hungarian Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old Italic Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Old North Arabian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old Permic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old Persian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Old Sogdian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Old South Arabian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Old Turkic Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Oriya Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2015</td>
    <td>1.01</td>
  </tr>
  <tr>
    <td>Noto Sans Osage Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2017</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Osmanya Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Pahawh Hmong Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Palmyrene Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Pau Cin Hau Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Phags-Pa Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans PhagsPa Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Phoenician Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Psalter Pahlavi Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Rejang Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Runic Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Samaritan Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Saurashtra Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Sharada Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Shavian Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Siddham Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans SignWriting Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Sinhala Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td>2016</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Sinhala UI Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td>2016</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Sogdian Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Sora Sompeng Regular</td>
    <td>2.101</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Soyombo Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2019</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Sans Sundanese Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.05</td>
  </tr>
  <tr>
    <td>Noto Sans Syloti Nagri Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Symbols Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.09</td>
  </tr>
  <tr>
    <td>Noto Sans Symbols 2 Regular</td>
    <td>2.008</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Syriac Regular</td>
    <td>3</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Syriac Eastern Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Syriac Western Regular</td>
    <td>3</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tagalog Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Tagbanwa Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tai Le Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tai Tham Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Tai Viet Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.03</td>
  </tr>
  <tr>
    <td>Noto Sans Takri Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2020</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Sans Tamil Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Sans Tamil UI Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.003</td>
  </tr>
  <tr>
    <td>Noto Sans Tamil Supplement Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tangsa Regular</td>
    <td>1.506</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Telugu Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.004</td>
  </tr>
  <tr>
    <td>Noto Sans Telugu UI Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2022</td>
    <td>2.004</td>
  </tr>
  <tr>
    <td>Noto Sans Test Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Thaana Regular</td>
    <td>3.001</td>
    <td>2022</td>
    <td>2014</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Thai Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2011</td>
    <td>1.04</td>
  </tr>
  <tr>
    <td>Noto Sans Thai Looped Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh APT Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Adrar Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Agraw Imazighen Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Ahaggar Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Air Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Azawagh Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Ghat Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Hawad Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Rhissa Ixa Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh SIL Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tifinagh Tawellemmet Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Tirhuta Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Ugaritic Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Vai Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Vithkuqi Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Wancho Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Warang Citi Regular</td>
    <td>3.002</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Sans Yi Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2013</td>
    <td>1.02</td>
  </tr>
  <tr>
    <td>Noto Sans Zanabazar Square Regular</td>
    <td>2.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Regular</td>
    <td>2.013</td>
    <td>2022</td>
    <td>2012</td>
    <td>1.07</td>
  </tr>
  <tr>
    <td>Noto Serif Ahom Regular</td>
    <td>2.007</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Armenian Regular</td>
    <td>2.008</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.005</td>
  </tr>
  <tr>
    <td>Noto Serif Balinese Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Bengali Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Devanagari Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Display Regular</td>
    <td>2.009</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Dives Akuru Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Dogra Regular</td>
    <td>1.007</td>
    <td>2022</td>
    <td>2019</td>
    <td>1.004</td>
  </tr>
  <tr>
    <td>Noto Serif Ethiopic Regular</td>
    <td>2.102</td>
    <td>2022</td>
    <td>2017</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Serif Georgian Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Grantha Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Gujarati Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Gurmukhi Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Hebrew Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2021</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Hentaigana ExtraLight Regular</td>
    <td></td>
    <td></td>
    <td>2023</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Noto Serif Kannada Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Khitan Small Script Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Khmer Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Khojki Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Lao Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td>2017</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Serif Makasar Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Malayalam Regular</td>
    <td>2.104</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Myanmar Regular</td>
    <td>2.106</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif NP Hmong Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td>2020</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Noto Serif Old Uyghur Regular</td>
    <td>1.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Oriya Regular</td>
    <td>1.051</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Ottoman Siyaq Regular</td>
    <td>1.006</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Sinhala Regular</td>
    <td>2.007</td>
    <td>2022</td>
    <td>2016</td>
    <td>2.002</td>
  </tr>
  <tr>
    <td>Noto Serif Tamil Regular</td>
    <td>2.004</td>
    <td>2022</td>
    <td>2017</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Tangut Regular</td>
    <td>2.169</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Telugu Regular</td>
    <td>2.005</td>
    <td>2022</td>
    <td>2019</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Test Regular</td>
    <td>1</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Thai Regular</td>
    <td>2.002</td>
    <td>2022</td>
    <td>2016</td>
    <td>2</td>
  </tr>
  <tr>
    <td>Noto Serif Tibetan Regular</td>
    <td>2.103</td>
    <td>2022</td>
    <td>2018</td>
    <td>2.001</td>
  </tr>
  <tr>
    <td>Noto Serif Toto Regular</td>
    <td>2.001</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Vithkuqi Regular</td>
    <td>1.005</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
  <tr>
    <td>Noto Serif Yezidi Regular</td>
    <td>1.001</td>
    <td>2022</td>
    <td>2020</td>
    <td>1</td>
  </tr>
  <tr>
    <td>Noto Traditional Nushu Regular</td>
    <td>2.003</td>
    <td>2022</td>
    <td></td>
    <td></td>
  </tr>
</tbody></table>

<h2 id="code"><a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#code">Code</a></h2>

<p>This Python code will get all the TTF fonts in a directory, and its sub-directories, and then print a Markdown table of name, version, and copyright date.</p>

<pre><code class="language-python">import os
import glob

filelist = glob.glob('**/*.ttf', recursive=True)

for file in sorted(filelist):
        filename = os.fsdecode(file)
        if filename.endswith(".ttf"):
                font = ttLib.TTFont(filename)
                ttf_name      = font["name"].getDebugName(1)
                ttf_style     = font["name"].getDebugName(2)
                ttf_version   = font["name"].getDebugName(5).split()[1].split(";")[0]
                ttf_copyright = font["name"].getDebugName(0).split()[1].split("-")[-1]
                print ( f"| {ttf_name} {ttf_style} | {ttf_version} | {ttf_copyright} |")
</code></pre>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:hebrew">
<p>Well, OK. For some reason the Pixel has an extremely outdated version of Hebrew and a slightly newer version of Color Emoji Flags.&nbsp;<a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fnref:hebrew" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:die">
<p>Which is where all bug reports submitted by the public go to die.&nbsp;<a href="https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/#fnref:die" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=53054&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/10/is-android-unicode-yet/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[An update to the Atkinson Hyperlegible font]]></title>
		<link>https://shkspr.mobi/blog/2022/08/an-update-to-the-atkinson-hyperlegible-font/</link>
					<comments>https://shkspr.mobi/blog/2022/08/an-update-to-the-atkinson-hyperlegible-font/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 26 Aug 2022 11:34:29 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[HowTo]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[Open Source]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43351</guid>

					<description><![CDATA[I&#039;m a huge fan of the US Braille Institute&#039;s Atkinson Hyperlegible font. This blog is typeset in it, and I think it looks gorgeous. It&#039;s also specifically designed to be readable to people with visual impairments:  Atkinson Hyperlegible differentiates common misinterpreted letters and numbers using various design techniques:    There&#039;s only one problem, the font was released a few years ago and…]]></description>
										<content:encoded><![CDATA[<p>I'm a huge fan of the <a href="https://brailleinstitute.org/freefont">US Braille Institute's Atkinson Hyperlegible font</a>. This blog is typeset in it, and I think it looks gorgeous. It's also specifically designed to be readable to people with visual impairments:</p>

<blockquote><p>Atkinson Hyperlegible differentiates common misinterpreted letters and numbers using various design techniques:</p></blockquote>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/BIA_AtkinsonHyerlegible-recognizable-footprints-differentiated-letterforms-transparent.png" alt="The font is displayed with a high level of blur to simulate low vision. The letters and numbers are still recognisable." width="700" height="420" class="aligncenter size-full wp-image-43352">

<p>There's only one problem, the font was released a few years ago and hasn't been updated since. It covers most of the basic European letters, numbers, accents, and symbols - but not all.  I wondered if it was going to receive any updates:</p>

<style>.social-embed{all:unset;display:block;}.social-embed * {all:unset;display:revert;}.social-embed::after{all:unset;}.social-embed::before{all:unset;}blockquote:not(*){all:unset;}.social-embed a{cursor:pointer;}blockquote.social-embed{box-sizing:border-box;border:.5px solid;width:550px;max-width:100%;font-family:sans-serif;margin:auto;margin-bottom:.5em;padding:1em;border-radius:1em;background-color:#FFF;color:#000;display:block;}.social-embed-header{display:flex;justify-content:space-between;}.social-embed-user{display:flex;position:relative;align-items:center;text-decoration:none;color:inherit;}.social-embed-avatar{width:3em;height:3em;margin-right:.5em;}.social-embed-avatar-circle{border-radius:50%;}.social-embed-avatar-square{border-radius:5%;}.social-embed-user-names-name{display:flex;align-items:center;font-weight:bold;margin:0;}.social-embed-text{margin-top:.5em;}.social-embed-footer{display:flex;align-items:center;justify-content:space-between;}.social-embed-logo{width:3em;}.social-embed-hr{border:.1px solid;margin:.5em 0 .5em 0;}.social-embed-meta{text-decoration:none !important;color:unset !important;}.social-embed-reply{display:block;}.social-embed-text a, .social-embed-footer time{color:blue;text-decoration:underline;}.social-embed-media, .social-embed-video{border-radius:1em;max-width:100%;margin:auto;display:block;}.social-embed-reply{font-size:.75em;display:block;}.social-embed-meter{width:100%;background:#0005;}.social-embed-card{text-decoration:none !important;color:unset !important;border:.5px solid;display:block;font-size:.85em;padding:.5em;border-radius:1em;}</style>

<blockquote class="social-embed" id="social-embed-1554606689130651651" lang="en"><blockquote class="social-embed" id="social-embed-1554429060130000896" lang="en"><header class="social-embed-header"><a href="https://twitter.com/edent" class="social-embed-user"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt=""><div class="social-embed-user-names"><p class="social-embed-user-names-name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCmFyaWEtbGFiZWw9IlR3aXR0ZXIiIHJvbGU9ImltZyIKdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoCmQ9Im0wIDBINTEyVjUxMkgwIgpmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0iIzFkOWJmMCIgZD0ibTQ1OCAxNDBxLTIzIDEwLTQ1IDEyIDI1LTE1IDM0LTQzLTI0IDE0LTUwIDE5YTc5IDc5IDAgMDAtMTM1IDcycS0xMDEtNy0xNjMtODNhODAgODAgMCAwMDI0IDEwNnEtMTcgMC0zNi0xMHMtMyA2MiA2NCA3OXEtMTkgNS0zNiAxczE1IDUzIDc0IDU1cS01MCA0MC0xMTcgMzNhMjI0IDIyNCAwIDAwMzQ2LTIwMHEyMy0xNiA0MC00MSIvPjwvc3ZnPg=="></header><section class="social-embed-text"><small class="social-embed-reply"><a href="https://twitter.com/BrailleInst">Replying to @BrailleInst</a></small><a href="https://twitter.com/BrailleInst">@BrailleInst</a> I'd like to help improve the Atkinson Hyperlegible Font - <a href="https://brailleinstitute.org/freefont">brailleinstitute.org/freefont</a><br>Are you open to contributions?</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1554429060130000896" aria-label="1 likes" class="social-embed-meta">❤️ 1</a><a href="https://twitter.com/edent/status/1554429060130000896" aria-label="0 replies" class="social-embed-meta">💬 0</a><a href="https://twitter.com/edent/status/1554429060130000896" aria-label="0 retweets" class="social-embed-meta">♻️ 0</a><a href="https://twitter.com/edent/status/1554429060130000896"><time datetime="2022-08-02T11:29:02.000Z">11:29 - Tue 02 August 2022</time></a></footer></blockquote><header class="social-embed-header"><a href="https://twitter.com/BrailleInst" class="social-embed-user"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRgoBAABXRUJQVlA4IP4AAAAQBwCdASowADAAPrVYo06nJSMiI4oA4BaJZwDOdYvsYIkyjumgZEvwrMJVhH7sobnyhZ9YHJ+CcKgEwvjDsK7JgAD+/fcO3fmfqtmjiGVfqN+y9e8s7mjZae8Hx/vrFIXvBARX31LwYAg56r2WM/avGfTDmDsz1jW7zWML4BiHZgitgJ3YRsXZS3rrvV+gY2UooUxNl+KYvNlaRzdS6itg8yhdpPSwzJAM94yl1e+1i5X0I/udUpPBOfkcGfPqWXlvpp4O6+K0o+mXOSab7w+87NcyboAuN4Ug8NS7l4UzyycZBekVFpu7MFyhK3Yhyb7qbr8/CtlnEOWFOaOoAA==" alt=""><div class="social-embed-user-names"><p class="social-embed-user-names-name">Braille Institute</p>@BrailleInst</div></a><img class="social-embed-logo" alt="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCmFyaWEtbGFiZWw9IlR3aXR0ZXIiIHJvbGU9ImltZyIKdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoCmQ9Im0wIDBINTEyVjUxMkgwIgpmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0iIzFkOWJmMCIgZD0ibTQ1OCAxNDBxLTIzIDEwLTQ1IDEyIDI1LTE1IDM0LTQzLTI0IDE0LTUwIDE5YTc5IDc5IDAgMDAtMTM1IDcycS0xMDEtNy0xNjMtODNhODAgODAgMCAwMDI0IDEwNnEtMTcgMC0zNi0xMHMtMyA2MiA2NCA3OXEtMTkgNS0zNiAxczE1IDUzIDc0IDU1cS01MCA0MC0xMTcgMzNhMjI0IDIyNCAwIDAwMzQ2LTIwMHEyMy0xNiA0MC00MSIvPjwvc3ZnPg=="></header><section class="social-embed-text"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1554429060130000896">Replying to @edent</a></small><a href="https://twitter.com/edent">@edent</a> <a href="https://twitter.com/edent">@edent</a> thank you for your interest in the Atkinson font.  We don’t presently have any plans for future enhancements but we will be sure to keep you in mind.</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/BrailleInst/status/1554606689130651651" aria-label="2 likes" class="social-embed-meta">❤️ 2</a><a href="https://twitter.com/BrailleInst/status/1554606689130651651" aria-label="1 replies" class="social-embed-meta">💬 1</a><a href="https://twitter.com/BrailleInst/status/1554606689130651651" aria-label="0 retweets" class="social-embed-meta">♻️ 0</a><a href="https://twitter.com/BrailleInst/status/1554606689130651651"><time datetime="2022-08-02T23:14:52.000Z">23:14 - Tue 02 August 2022</time></a></footer></blockquote>

<p>Sadly not! The font was released under the SIL Open Font Licence V1.0 which allows for remixing - under certain conditions. So that's what I've done!</p>

<p>Introducing <a href="https://github.com/edent/extended-hyperlegible"><em>Extended</em> Hyperlegible</a>!  At the moment, it contains exactly <em>one</em> new character - U+1F12F, the copyleft symbol 🄯.</p>

<p>I hope to add a few more glyphs as an when I have time. Contributions very much welcomed!</p>

<h2 id="how-to-add-new-symbols-to-a-font"><a href="https://shkspr.mobi/blog/2022/08/an-update-to-the-atkinson-hyperlegible-font/#how-to-add-new-symbols-to-a-font">How to add new symbols to a font</a></h2>

<p>This was a bit of a learning journey for me. Here are some notes to future-me.</p>

<ol>
<li>Use <a href="https://fontforge.org/">FontForge</a> to open the original .otf font.</li>
<li>Select the copyright symbol and copy it.<br><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-from-2022-08-14-13-50-42.png" alt="Fontforge with the copyright symbol selected and context menu open." width="601" height="331" class="aligncenter size-full wp-image-43406"></li>
<li>Select an empty symbol and paste it in.<br><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-from-2022-08-14-13-52-16.png" alt="Copyright symbol pasted in to a blank slot in FontForge." width="601" height="331" class="aligncenter size-full wp-image-43407"></li>
<li>View the "Glyph Info".<br><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-from-2022-08-14-13-54-41.png" alt="Glyph Info page." width="742" height="356" class="aligncenter size-full wp-image-43408"></li>
<li>Edit the Unicode Value to <code>U+1F12F</code> and select "Set From Value".  Optionally, edit the "Glyph Name". And hit the OK button.</li>
<li>Select the glyph, right click and select "Transform"<br><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-from-2022-08-14-13-56-33.png" alt="Context menu showing Transform." width="604" height="601" class="aligncenter size-full wp-image-43409"></li>
<li>Flip the glyph horizontally.<br><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-from-2022-08-14-13-57-12.png" alt="Font transformation options." width="604" height="601" class="aligncenter size-full wp-image-43410"></li>
<li>In the context menu, choose "Correct Direction".<br><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Correct-Direction-fs8.png" alt="Screenshot showing the option." width="310" height="248" class="aligncenter size-full wp-image-48748"></li>
<li>Optionally, skew it for the italic version.</li>
<li>In "Font Information" you can rename the font and set other metadata.<br><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-from-2022-08-14-14-04-36.png" alt="Metadata editing screen." width="604" height="601" class="aligncenter size-full wp-image-43412"></li>
<li>Use File → Generate Fonts to save the new font as <code>copyleft.otf</code><br><img src="https://shkspr.mobi/blog/wp-content/uploads/2022/08/Screenshot-from-2022-08-14-13-58-44.png" alt="FontForge Export menu." width="604" height="601" class="aligncenter size-full wp-image-43411"></li>
</ol>

<h2 id="use-fonttools"><a href="https://shkspr.mobi/blog/2022/08/an-update-to-the-atkinson-hyperlegible-font/#use-fonttools">Use FontTools</a></h2>

<p>Install <a href="https://fonttools.readthedocs.io/en/latest/">FontTools</a> - either using <code>pip3</code> or <code>apt get</code></p>

<p>Convert the TTF to TTX format:</p>

<p><code>fonttools ttx merged.ttf</code></p>

<p>Edit the new <code>merged.ttx</code> by hand to update the name, copyright, etc.</p>

<p>Save the file as <code>new.ttx</code></p>

<p>Generate a new OTF by running</p>

<p><code>fonttools ttx new.ttx</code></p>

<p>Optionally, run <code>fonttools ttx new.otf</code> to regenerate the TTX.</p>

<p>Optionally, run <code>fonttools ttLib.woff2 compress new.otf</code> to generate a WOFF2 font for the web.</p>

<h2 id="upload-to-github-and-wait-for-contributors"><a href="https://shkspr.mobi/blog/2022/08/an-update-to-the-atkinson-hyperlegible-font/#upload-to-github-and-wait-for-contributors">Upload to GitHub and wait for contributors</a></h2>

<p>Well, what are you waiting for? <a href="https://github.com/edent/extended-hyperlegible">Use or contribute to <em>Extended</em> Hyperlegible</a> today!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43351&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/08/an-update-to-the-atkinson-hyperlegible-font/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Banish the � with Unifont]]></title>
		<link>https://shkspr.mobi/blog/2019/04/banish-the-%ef%bf%bd-with-unifont/</link>
					<comments>https://shkspr.mobi/blog/2019/04/banish-the-%ef%bf%bd-with-unifont/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 04 Apr 2019 11:34:58 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[unicode]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=31828</guid>

					<description><![CDATA[The GNU Unifont project is amazing. It contains every Unicode glyph in one single file!  I am going to argue that you should bundle it with your apps, your operating systems, and - at a pinch - your websites.  The Unifont is a perfect fallback font. If your app or website uses a Unicode character which isn&#039;t supported on a device, the user will usually see � - a replacement character. If you i…]]></description>
										<content:encoded><![CDATA[<p>The <a href="http://unifoundry.com/unifont/index.html">GNU Unifont</a> project is amazing. It contains <em>every</em> Unicode glyph in one single file!  I am going to argue that you should bundle it with your apps, your operating systems, and - at a pinch - your websites.</p>

<p>The Unifont is a perfect fallback font. If your app or website uses a Unicode character which isn't supported on a device, the user will usually see � - a replacement character. If you include Unifont, they'll see the correct character.</p>

<p>There are two downsides:</p>

<ol>
<li>The TTF font is 12MB.</li>
<li>The font design is... Spartan... Each character is a maximum of 16-by-16 pixels.</li>
</ol>

<p>Good enough for "Latin": <img src="https://shkspr.mobi/blog/wp-content/uploads/2019/04/latin.png" alt="Latin characters with accents." width="560" height="544" class="aligncenter size-full wp-image-31832">
"CJK": <img src="https://shkspr.mobi/blog/wp-content/uploads/2019/04/cjk.png" alt="Chinese, Japanese, and Korean pictograms." width="560" height="544" class="aligncenter size-full wp-image-31830"></p>

<p>and Emoji: <img src="https://shkspr.mobi/blog/wp-content/uploads/2019/04/emoji.png" alt="Lots of Emoji" width="560" height="544" class="aligncenter size-full wp-image-31831"></p>

<h2 id="compression"><a href="https://shkspr.mobi/blog/2019/04/banish-the-%ef%bf%bd-with-unifont/#compression">Compression</a></h2>

<p>Using the WOFF2 format, Unifont compresses to a svelte 1.5MB.  I am not arguing that you should serve an extra couple of MB on every webpage (although modern sites are so bloated it probably doesn't matter...) - but perhaps you should bundle it with your webview apps.</p>

<h2 id="use-on-the-web"><a href="https://shkspr.mobi/blog/2019/04/banish-the-%ef%bf%bd-with-unifont/#use-on-the-web">Use on the web</a></h2>

<p>I've converted it, so you can directly <a href="https://gitlab.com/edent/unifont/raw/master/public/unifont-12.0.01.woff2">download unifont-12.0.01.woff2</a> which covers all Basic Multilingual Plane characters.  You can also <a href="https://gitlab.com/edent/unifont/raw/master/public/unifont_upper-12.0.01.woff2">download the Upper Planes</a> for Emoji and more esoteric characters.</p>

<p>If anyone knows how to combine WOFF2 fonts - please let me know!</p>

<h3 id="css"><a href="https://shkspr.mobi/blog/2019/04/banish-the-%ef%bf%bd-with-unifont/#css">CSS</a></h3>

<pre><code class="language-css">@font-face {
    font-family: &amp;quot;unifont&amp;quot;;
    src: url(&amp;quot;unifont-12.0.01.woff2&amp;quot;);
}
@font-face {
  font-family: &amp;quot;unifont-upper&amp;quot;;
  src: url(&amp;quot;unifont_upper-12.0.01.woff2&amp;quot;);
  unicode-range: U+10000-10FFFF;
}

body {
    font-family: &amp;quot;unifont&amp;quot;, &amp;quot;unifont-upper&amp;quot;
}
</code></pre>

<p>You can use it on your webpage, it is <a href="http://unifoundry.com/LICENSE.txt">GPLv2 with the font licencing exemption</a>.</p>

<h3 id="demo"><a href="https://shkspr.mobi/blog/2019/04/banish-the-%ef%bf%bd-with-unifont/#demo">Demo!</a></h3>

<p>You can <a href="https://edent.gitlab.io/unifont/">see typography examples on my demo page</a>.</p>

<h2 id="does-it-work-for-every-language"><a href="https://shkspr.mobi/blog/2019/04/banish-the-%ef%bf%bd-with-unifont/#does-it-work-for-every-language">Does it work for every language?</a></h2>

<p>Almost!</p>

<blockquote><p>Unifont only stores one glyph per printable Unicode code point. This means that complex scripts with special forms for letter combinations including consonant combinations and floating vowel marks such as with Indic scripts (Devanagari, Bengali, Tamil, etc.) or letters that change shape depending upon their position in a word (Indic and Arabic scripts) will not render well in Unifont. In those cases, Unifont is only suitable as a font of last resort. Users wishing to properly render such complex scripts should use full OpenType fonts that faithfully display such alternate forms.</p></blockquote>

<h2 id="are-you-serious"><a href="https://shkspr.mobi/blog/2019/04/banish-the-%ef%bf%bd-with-unifont/#are-you-serious">Are you serious?</a></h2>

<p>Pretty much! Like I said earlier, including an extra couple of MB isn't always necessary - but it isn't excessive on complex sites.</p>

<p>Ideally, modern operating systems would include all the characters you'd ever need and be regularly updated. Sadly, that's rarely the case.</p>

<p>One of the <em>best</em> things about <a href="http://unifoundry.com/unifont/index.html">Unifont</a> is that it is regularly updated.  Usually there are several updates each year - mostly as soon as there's a new Unicode release.</p>

<p>Sure, the font isn't the prettiest in the world. But I will always prefer a pixelated symbol rather than a �.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=31828&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/04/banish-the-%ef%bf%bd-with-unifont/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Premature Subsetting of Web Fonts]]></title>
		<link>https://shkspr.mobi/blog/2015/11/premature-subsetting-of-web-fonts/</link>
					<comments>https://shkspr.mobi/blog/2015/11/premature-subsetting-of-web-fonts/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 11 Nov 2015 11:59:52 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=21572</guid>

					<description><![CDATA[If you thought Web Fonts were pretty nifty, then you&#039;re going to think font subsetting is really cool.  No, honestly! It is!  As I&#039;ve written about before you can dramatically reduce the size of your Web Fonts by cutting out characters that you don&#039;t need.  For example, suppose you don&#039;t need to include the русский алфавит - you can immediately drop 66 letters (upper- and lower-case), a whole load…]]></description>
										<content:encoded><![CDATA[<p>If you thought Web Fonts were pretty nifty, then you're going to think font subsetting is really cool.  No, honestly! It is!  As <a href="https://shkspr.mobi/blog/2013/05/subsetting-chinese-fonts/">I've written about before</a> you can dramatically reduce the size of your Web Fonts by cutting out characters that you don't need.</p>

<p>For example, suppose you don't need to include the <abbr title="Russian Alphabet">русский алфавит</abbr> - you can immediately drop 66 letters (upper- and lower-case), a whole load of accents, and a bunch of other Cyrillic stuff.  That's up to <a href="https://en.wikipedia.org/wiki/Cyrillic_script_in_Unicode">400 fewer characters</a> - a <strong>huge</strong> space saving.</p>

<p>Here's how the <a href="http://www.fontsquirrel.com/tools/webfont-generator">Font Squirrel Webfont Generator</a> handles subsetting:
<a href="http://www.fontsquirrel.com/tools/webfont-generator"><img src="https://shkspr.mobi/blog/wp-content/uploads/2015/10/Font-Subsetting-fs8.png" alt="Font Subsetting-fs8" width="768" height="740" class="aligncenter size-full wp-image-21573"></a></p>

<p>Depending on the font you start with and the characters you anticipate you'll need, you can easily optimize your webfont size more than any <a href="http://google-opensource.blogspot.co.uk/2015/09/introducing-brotli-new-compression.html">Brotli compression</a> could hope to manage.</p>

<p>Now, what do all good computer programmers know about <a href="http://ubiquity.acm.org/article.cfm?id=1513451">Premature Optimization</a>?</p>

<p>So, some clever web designers have realised that they can eke out a few more microseconds of performance if they drop all of the weird characters from their fancy web fonts and stick to good ol' fashioned US-ASCII.</p>

<p>Which has this unfortunate side effect.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2015/10/Premature-Subsetting-2.jpg" alt="Premature Subsetting 2" width="1024" height="579" class="aligncenter size-full wp-image-21574">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2015/10/Premature-Subsetting.jpg" alt="Premature Subsetting" width="1024" height="463" class="aligncenter size-full wp-image-21575">

<p>As you can see from these two examples, there's a designer somewhere wailing and gnashing their teeth at the sight of these abominations.  All that hard work - <em>and cost</em> - of choosing the right font ruined, because someone thought they'd drop support for European accents.</p>

<p>Is this worth it?  Let's take a look at the <a href="http://www.fontsquirrel.com/fonts/New-Athena-Unicode">New Athena Unicode</a> font as a good example.</p>

<blockquote><p>New Athena Unicode is a freeware multilingual font distributed by the American Philological Association. It follows the latest version of the Unicode standard and includes characters for English and Western European languages, polytonic Greek, Coptic, Old Italic, and Demotic Egyptian (and Arabic) transliteration, as well as metrical symbols and other characters used by classical scholars.</p></blockquote>

<p>The font contains 1825 glyphs - the TTF is 690KB. Once converted into the heavily compressed WOFF2 format, it's 149KB.  Using the FontSquirrel subsetter to get <em>just</em> the common English language characters results in a WOFF2 font of 17KB.  Tiny!</p>

<p>Ok, that's a pretty decent chunk saved - but at the expense of the most European languages. Adding back in French, German, Italian, Polish, and the <a href="https://en.wikipedia.org/wiki/Latin_Extended-A">Latin set</a> takes the font up to 35KB.  Yes, the size has doubled - but I'd argue it's now several times more useful</p>

<p>Be smart.  Do you really need extended punctuation like
‰‱′″‴‵‶‷‸‹››※‼‽‾‿⁀⁁⁂⁃⁄⁅⁆⁇⁈⁉⁊⁋⁌⁍⁎⁏⁐⁑⁒⁓⁔⁕⁖⁗⁘⁙⁚⁛⁜?</p>

<p>No, probably not. Strip it out.  But take a look at what you <strong>do</strong> use.  There's no "correct" answer for this, by the way.  If you're confident that your reporters are never going to interview someone with a Polish name - leave out those letters.  Or, have your database regenerate fonts on the fly when it receives a previously unseen character.</p>

<p>But please don't pretend that these "unusual" characters don't exist!  You're publishing on the <strong>World Wide</strong> Web - act like it.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=21572&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2015/11/premature-subsetting-of-web-fonts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[How To Use System Emoji With Webfonts?]]></title>
		<link>https://shkspr.mobi/blog/2014/12/how-to-use-system-emoji-with-webfonts/</link>
					<comments>https://shkspr.mobi/blog/2014/12/how-to-use-system-emoji-with-webfonts/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 29 Dec 2014 11:57:20 +0000</pubDate>
				<category><![CDATA[mobile]]></category>
		<category><![CDATA[usability]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=20370</guid>

					<description><![CDATA[tl;dr - If a mobile web browser recognises an Emoji, it should display it natively. If not, it should fall back to a supplied web font. Is this possible?  When Android and iOS find Emoji in text, rather than display them as black-and-white fonts, they show them off in gorgeous colour.  For example, the unicode smilie is ☺.  Depending on your system, it will look something like this: From  Tim W…]]></description>
										<content:encoded><![CDATA[<p>tl;dr - If a mobile web browser recognises an Emoji, it should display it natively. If not, it should fall back to a supplied web font. Is this possible?</p>

<p>When Android and iOS find Emoji in text, rather than display them as black-and-white fonts, they show them off in gorgeous colour.</p>

<p>For example, the unicode smilie is ☺.  Depending on your system, it will look something like this:
</p><div id="attachment_20371" style="width: 747px" class="wp-caption aligncenter"><a href="http://apps.timwhitlock.info/emoji/tables/unicode"><img aria-describedby="caption-attachment-20371" src="https://shkspr.mobi/blog/wp-content/uploads/2014/12/Smile-Fonts-fs8.png" alt="From  Tim Whitlock" width="737" height="84" class="size-full wp-image-20371"></a><p id="caption-attachment-20371" class="wp-caption-text">From <a href="http://apps.timwhitlock.info/emoji/tables/unicode"> Tim Whitlock</a></p></div><p></p>

<p>So far, so nifty!  But here we hit a snag.  Not every computer has a font which contains all the characters we want.</p>

<p>Consider this problem:  I want to replace some of the links on my web page with symbols.
I've chosen:🏠✉ 🔍♻⚙ℹ</p>

<p>If your system supports all those characters, you should see symbols for home, mail, search, recycle, settings cog, &amp; information.</p>

<p>On Android 4.4, the above look like:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2014/12/Android-Emoticon-Fonts-fs8.png" alt="Android Emoticon Fonts-fs8" width="326" height="91" class="aligncenter size-full wp-image-20382"></p>

<p>Android Lollipop improves things somewhat - although the mail and recycle symbols both take a retrograde step:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2014/12/Android-Lolipop-Emoticon-Fonts-fs8.png" alt="Android Lolipop Emoticon Fonts-fs8" width="326" height="91" class="aligncenter size-full wp-image-20384"></p>

<p>Good enough for what I want to do - but what happens when we look at it on a desktop?
<img src="https://shkspr.mobi/blog/wp-content/uploads/2014/12/Desktop-Emoticon-Fonts-fs8.png" alt="Desktop Emoticon Fonts-fs8" width="326" height="91" class="aligncenter size-full wp-image-20387">
The plain nature of the fonts I can live with - the broken characters I cannot.</p>

<p>Fine - let's find a font which has <em>all</em> those symbols.  Alexander Lange maintains the excellent <a href="http://www.quivira-font.com/">Quivira Font</a>, the latest version (4.1) contains 11,053 characters - including all the ones I want.  The font is 1.5MB - which is too large for most uses, and particularly unsuitable for mobile.  It's possible to <a href="https://shkspr.mobi/blog/2013/05/subsetting-chinese-fonts/" title="Subsetting (Chinese) Fonts">subset the font so that it only contains the needed characters</a>.</p>

<p>That gives us this set of symbols:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2014/12/Quivira-Symbols-fs8.png" alt="Quivira Symbols-fs8" width="400" height="70" class="aligncenter size-full wp-image-20388"></p>

<p>Ok, not the prettiest pig in the pen - but at least they're fairly consistent.</p>

<p>Here's where I hit my snag.  I want devices which <em>recognise</em> those characters to display them with colourful emoji.  Any device which doesn't recognise them, should use the symbol font I've created.</p>

<p>I naïvely thought that this CSS would work:</p>

<pre><code class="language-css">@font-face {
    font-family: 'quiviraregular';
    src: url('quivira.eot');
    src: url('quivira.eot?#iefix') format('embedded-opentype'),
         url('fonts/quivira.woff2') format('woff2'),
         url('quivira.woff') format('woff'),
         url('quivira.ttf') format('truetype');
}

body{
    font-family:sans-serif,quiviraregular;
}
</code></pre>

<p>Theoretically, Quivira should only be called if the font is <em>not</em> found in the system's sans-serif set.  But it doesn't.  I've tried on Android with Chrome, Firefox, and Opera.  No dice.</p>

<p>It doesn't matter <em>what</em> I put in that font-family declaration.  Once Android detects a font with the glyph, it doesn't fall back to displaying it as an emoji.</p>

<p>I fiddled around with several font-family settings I found around the web "pictograph", "fantasy", "Apple Color Emoji", "Droid Emoji", "emoji" (<a href="https://coderwall.com/p/ruv9hq/display-emoji-glyphs-intermingled-with-arbitrary-text">using this shim</a>) - none of them worked.</p>

<p>It's possible to set a unicode-range for fonts.  I couldn't find a way to tell browsers to use their fallback fonts <em>first</em> for a specific range.</p>

<p>I can <a href="http://stackoverflow.com/questions/25036270/how-to-build-a-solid-css-font-stack-for-emoji">find the <strong>names</strong> of the Emoji system fonts</a> - but I can't find a way to reference them.</p>

<p>I've tried every variation I can think of:</p>

<pre><code class="language-css">@font-face {
    font-family: 'emoji';
    src:  local('Android Emoji'),
    src:  local('NotoColorEmoji'),
    src:  local('NotoColorEmoji.ttf'),
    src:  local('/system/fonts/NotoColorEmoji.ttf'),
    src:  local('Noto Color Emoji'),
    src:  local('Android Emoji');
}
body{
    font-family:emoji,sans-serif,quiviraregular;
}
</code></pre>

<p>And</p>

<pre><code class="language-css">body{
    font-family:'Android Emoji','NotoColorEmoji','NotoColorEmoji.ttf','/system/fonts/NotoColorEmoji.ttf','Noto Color Emoji','Android Emoji',sans-serif,quiviraregular;
</code></pre>

<p>Still no difference - it does not show the colourful Emoji. Instead it just falls through to the symbol font I created.</p>

<p>Well, I'm stumped!  Does anyone know the answer?  I'd really rather use fonts than images.</p>

<ol>
    <li>If a browser has an Emoji representation of a character - show it.</li>
    <li>If not, use the provided font.</li>
</ol>

<p>If you know, please leave a comment here or on <a href="http://stackoverflow.com/questions/27688046/css-reference-to-phones-emoji-font">StackOverflow</a>.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=20370&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2014/12/how-to-use-system-emoji-with-webfonts/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Subsetting (Chinese) Fonts]]></title>
		<link>https://shkspr.mobi/blog/2013/05/subsetting-chinese-fonts/</link>
					<comments>https://shkspr.mobi/blog/2013/05/subsetting-chinese-fonts/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 22 May 2013 07:52:11 +0000</pubDate>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[chinese]]></category>
		<category><![CDATA[font]]></category>
		<category><![CDATA[fonts]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[utf-8]]></category>
		<guid isPermaLink="false">http://shkspr.mobi/blog/?p=8294</guid>

					<description><![CDATA[There are loads of really delightful Simplified and Traditional Chinese True Type Fonts available on the web.  There&#039;s only one issue - the file sizes are really large.  In many cases, too large to effectively use as a web-font.  For example, this calligraphy style font is 3.4MB.    The beautiful Paper Cut Font weighs in at 14MB!    That file-size is far to heavy to embed on a web page. …]]></description>
										<content:encoded><![CDATA[<p>There are loads of really delightful <a href="https://web.archive.org/web/20130520092556/http://chinesefont.brushes8.com/tag/simplified-chinese-font">Simplified and Traditional Chinese True Type Fonts</a> available on the web.  There's only one issue - the file sizes are really large.  In many cases, too large to effectively use as a web-font.</p>

<p>For example, this <a href="https://web.archive.org/web/20121219024439/http://chinesefont.brushes8.com/richwin-fonts/richwin-xing-kai-jian-fan-font.html">calligraphy style font</a> is 3.4MB.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2013/05/Richwin-Xing-kai-jian-Fan-Font-fs8.png" alt="Richwin-Xing-kai-jian-Fan-Font-fs8" width="445" height="79" class="alignnone size-full wp-image-8296">

<p>The beautiful <a href="https://web.archive.org/web/20140608004145/http://chinesefont.brushes8.com/xin-di-paper-cut-font-simplified-chinese.html">Paper Cut Font</a> weighs in at 14MB!</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2013/05/Paper-Cut-Chinese-Font-fs8.png" alt="Paper Cut Chinese Font-fs8" width="487" height="223" class="alignnone size-full wp-image-8297">

<p>That file-size is far to heavy to embed on a web page.</p>

<h2 id="subsetting"><a href="https://shkspr.mobi/blog/2013/05/subsetting-chinese-fonts/#subsetting">Subsetting</a></h2>

<p>Generally speaking, font files like .ttf contain a representation of every single character. 0-9, a-z, A-z, all the punctuation, non-English characters etc.</p>

<p>That's really useful if the font is installed on your computer and you want to write a document which <em>could</em> contain every character.  It's less helpful if you want to use a fancy font on your website's headers.</p>

<p>Subsetting is the act of creating a subset of a font.  That is, a font file which only contains specific characters.</p>

<p>Let's suppose that we only want a specific phrase rendered in this font.</p>

<pre>我很丢脸。我没有吃Fruity Oaty Bar</pre>

<p>We only need 19 unique characters - we can get rid of any character which doesn't appear in that heading.</p>

<p>There are sevel font manipulation tools available.  I've chosen <a href="https://web.archive.org/web/20130522120140/http://fonts.philip.html5.org/">Font Optimizer</a> which has an excellent live demo page.  The <a href="https://web.archive.org/web/20160322095140/https://bitbucket.org/philip/font-optimizer/overview">source code is on BitBucket</a>.</p>

<p>The command line syntax is really simple</p>

<pre>./subset.pl --chars="我很丢脸。我没有吃Fruity Oaty Bar" input.ttf output.ttf</pre>

<p>The file size reduction is impressive.  My original font was over 14MB.  The optimized one is 32<strong>K</strong>B</p>

<pre>14,066,456 input.ttf
   32,084 output.ttf
</pre>

<p>The process run instantly - fast enough to run as a web service to generate these fonts dynamically, I would think.</p>

<p>One could quite easily create a scrap of JavaScript which read the contents of a block of text and then requested a font which contained only the necessary characters.</p>

<p>Apparently, <a href="https://web.archive.org/web/20130620105955/http://scripts.sil.org/cms/scripts/page.php?item_id=OFL_web_fonts_and_RFNs#b4599c52">Monotype have a proprietary and patent-pending solution</a> to this rather trivial application.</p>

<h2 id="uses"><a href="https://shkspr.mobi/blog/2013/05/subsetting-chinese-fonts/#uses">Uses</a></h2>

<p>Being able to subset fonts to reduce file size is incredibly useful.  Supposing you want a different font for body text, headers, and navigation.  Rather than having to load three large font files containing every character in the known universe, you could subset each one for only exactly the relevant characters.</p>

<p>This also has an interesting DRM like effect.  Some people don't want their shiny web fonts to be downloaded and used as a regular font.  With subsetting, the font only contains the specific characters.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=8294&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2013/05/subsetting-chinese-fonts/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
