Furifont, a Japanese font that shows furigana
furifont.antfu.me207 points by plaguna 3 days ago
207 points by plaguna 3 days ago
I think this is a rare “useful” abuse of font ligatures, and in that respect I think this is a cool project, but it's also a terrible idea that nobody should actually use, because Japanese kanji readings are famously ambiguous and context-dependent. The modal character has two different readings without counting those used in personal names, nor contextual slight changes to pronunciation. Some characters have six different readings, and that's again without counting those used in personal names. There's no way a font can do a good job at it unless you can somehow stuff an entire LLM in there.
For context, it's a hard enough problem that Google Translate's own romanised pronunciation guides are frequently wrong, or disagree with their text-to-speech.
> unless you can somehow stuff an entire LLM in there.
Well, it wouldn't be the first time ;)
Yeah, I already see a few mistakes just looking at this page. But I guess still useful?
> but it's also a terrible idea that nobody should actually use, because Japanese kanji readings are famously ambiguous and context-dependent
Seems a bit drastic. Don't use it as the main font in a japanese textbook, sure, but use it with the disclaimer that it's not perfect and will get some readings wrong? Why not, still pretty useful. Should people also not use Google Translate? (also, you can stuff an entire llm in a font, it's been done).
The point of furigana is to be exact - it's a pronunciation guide, and its purpose is to distinguish or to teach. If it's wrong, then nothing makes sense.
If I asked you 'are you a sewer (pronounced "soo-er")?', would that make sense? Maybe if you looked at it hard enough and thought about it, but in the meantime, I would probably get some very strange looks for asking.
You're underestimating how wrong this is going to be on average. This is going to be nonsense like half the time. It's not comparable to Google Translate, it's more comparable to Babel Fish circa 1997.
Really nice font! Native Japanese speaker here, and seeing furigana done purely in the font is very cool.
One small thing on the Japanese version of the page: in the "Ligatures do the work" section, 合字 itself only gets じ over 字, and 合 has no reading. It should be ごうじ. I guess 合字 isn't in the dictionary, so it falls back to single kanji, and 合 is skipped because it has several readings.
Automatic furigana is not really possible to be reliable considering readings heavily rely on context that can't be easily inferred, but I'm sure it will help some people who can't read very well.
You can run LLMs inside the shaping engine, so maybe you can use more advanced segmenting and transliteration algorithms? https://fuglede.github.io/llama.ttf/
It can depend on implied information, e.g. 方 can be hou or kata depending on if you're talking about about direction or a person. And that information can be before it, after it, on some image next to it, etc.
"Your scientists were so preoccupied with whether or not they could, that they didn't stop to think if they should."
This is very cool. Unfortunate that it gives the wrong pronunciation when words get split in a line wrap (e.g., 大学 got split between lines and changed to incorrect furigana for me).
This is really nice. I'm able to read Hiragana and Katakana fully after about 4-6 weeks now but then I'm hit with the reality of how many Kanji I have to learn still everytime I want to read something in real life lol
I'm seeing Chinese versions of kanji on this website; the HTML might need a language annotation or something. https://i.postimg.cc/NGTvHP4x/Screenshot-2026-10-17-at-12-00...
That’s incredible. I’m always impressed with the utility of the TrueType/open font spec - the flexibility there is really an underappreciated work of engineering genius.
Arguably one of those cases where the capability is awesome, but using the capability is wat.
I mean, fonts are Turing-complete [0], so it isn’t surprising that this is possible. Turing-completeness is often by accident rather than by genius [1].
[0] https://litherum.blogspot.com/2019/03/addition-font.html
[1] https://en.wikipedia.org/wiki/Turing_completeness#Unintentio...
Which makes sense, because human language is apparently Turing complete, so anything intended to represent it faithfully would wind up with that characteristic, too.
Human language isn’t a formal language, so this is a category error.
In the present context, an example is that the common reading of a Kanji word isn’t always well-defined, and neither is the decomposition of a sequence of Kanji characters into words.
It's often used as one, though.
No, it’s not? https://en.wikipedia.org/wiki/Formal_language#Definition
It's an interesting move to point me to a rigorously written English language definition of a formal language to make the argument that humans don't co-opt our natural languages as formal languages when the need arises.
That’s not what “formal language” means. English being used to describe a formal definition doesn’t make it a formal language.
Bitmap fonts aren't turing complete. The fact that TrueType is built with an arbitrary virtual machine is insane, makes implementations ridiculously complex, and is a huge security liability. The purpose of the VM wasn't to "represent human language faithfully" but to make fonts look a little better when displayed at a variety of resolutions, via hinting. Hinting doesn't necessarily require a full VM, but somebody let the engineers have a little too much fun.
And yet, actually mapping all written human languages and their ligatures, variations, etc, seems to require this level of complexity. So the choice is either you draw the line and decide which languages you consider legitimate or not, or you build a machine of sufficient complexity to capture all languages, and the tradeoff, I suppose, is how much knowledge you want to actually be able to capture in your computerized system.
Unicode is distinct from, and completely unrelated to, TrueType. Unicode does not require a virtual machine to interpret. You can simply express languages and their variations with Unicode + bitmap fonts.
Unless you want ligatures.
Do you really believe the only way to implement ligatures is with a virtual machine? Dumb and dirty psuedocode written in 5 seconds of thinking about it but come on, this is not that complicated.
for each character in text
characterToPrint = Parse(character)
if character is LigatureStartCandidate
characterToPrint = LookAheadForNextLigatureCandidateAndResolve(character)
Print(characterToPrint)And you've now gotten 92% of the way there. Iterate a few dozen more times to get up to 97%, 98%, 99%, etc., and eventually you'll have rewritten OpenType.