It's a shame the author mixes up UTF-16 and UCS-2 when he says "Because it turns out UTF-16, another very popular encoding scheme, can’t represent codepoints that big." in reference to 0x1FFFFF.
It really can't. UTF-16 extends the space by 20 bits (split into 10 bits in each surrogate pair), and the highest UTF-16 sequence DBFF DFFF is 0x10FFFF.
You can define a second-tier surrogate system in UTF-16 on the last 2 planes (plane 0xF and plane 0x10), which are both private use, to access all codepoints up to 0x7FFFFFFF. Use plane 0xF as leading 2nd-tier surrogates, and plane 0x10 as trailing 2nd-tier surrogates. I've written a package in go that does just that: https://github.com/gavingroovygrover/utf88
And the UCS-2 limit is merely 0xFFFF, which of course is not big enough to handle all common human languages, thus why UTF-16 happened in the first place.