Takže pro shrnutí - UTF-8 dokáže kompletně zakódovat celé Unicode. Unicode samo o sobě dokáže reprezentovat všechny znaky snad až možná na nějaké poloprivátní obskurnosti které tě nemusí zajímat.
Dříve (v době kdy Unicode bylo nadefinováno jako až 2 miliardy (nebo 4?) znaků - tj. 4 byty) tak mělo mít UTF-8 1-6 znaků, ale moderní UTF-8 má již jen 1-4 (pro 21 bitové Unicode). To dává cca 1 milion znaků v 17 Unicode planech. První je standardní a obsahuje i hodně znaků z Čínštiny, Japonštiny a Korejštiny, ale ne všechny (tedy v prvních 64k znacích nejsou všechny asijské znaky), druhý nebo třetí jsou věnovány asijským znakům. Pak tam jsou někde i emoji.
Na Windows se používá často UTF-16, které vypadá že je fixní 2 bytové délky, ale pro reprezentaci znaků dál než 64k, používá tzv. surrogate pairs (coz znamená že některé znaky jsou ilegální bez svého párového doplňku).
Pro tvoji potřebu je jednoznačně správně použít UTF-8, a neřešit ani věci jako že možná některým asijským jazykům to zabere trochu více bytů, jak ukazuje ten odkaz na utf8everywhere tak to stejně většinou není problém (třeba pokud je to HTML tak je tam kupa kratších znaků které to vybalancují).
Jen bych doporučil použít odladěné knihovní funkce pro práci s tím a případně převod do Unicodové reprezentace v paměti (pokud to rovnou není v programovacím jazyků který stringy v paměti ukládá jako UTF-8). Existuje i sada unit testů na parser, možná by stálo za to na ně mrknout a kouknout jaké edge případy se tam řeší (např. jak se zachovat k ilegálním znakům a sekvencím bytů).