Co se týče UTF-8, tak pozor na pojem znak. Pokud chcete něco vypsat na obrazovku a zalámat to na znaky, tak musíte podporovat i znaky složené z více codepointů. Rozdělit slovo mezi písmenem a háčkem nad písmenem (pokud je zapsáno každé svým codepointem) by bylo rozhodně špatně, a striktní validátory by si mohly stěžovat na neplatnou kombinaci codepointů (háček nad koncem řádku?). Dalším, stále více rozmáhajícím "nešvarem" jsou emoji. Například "" jsou dva codepointy: a , a většina uživatelů má dnes webové prohlížeče, které to podporují. Na mobilních telefonech mají dokonce často emoji nějak přístupné tak, že vám to fláknou do webového formuláře ani nevíte jak.
https://stackoverflow.com/documentation/unicode/6485/characters-can-consist-of-multiple-code-points
https://stackoverflow.com/questions/6579844/how-does-zalgo-text-work
P.S. Další špek je při převodu z JSONu. JSON totiž ve formě \uXXXX používá UTF-16 zápis, takže nelze pouze pomocí UTF-8 zakódovat to 16bitové číslo, protože to může být jen půlka codepointu. Takový postgresql si pak pěkně stěžuje, když do něj někdo cpe takto špatně zakódované emoji.
UTF-16 je to nejhorší z obou světů - nemá ani konstantní šířku jako UCS a ani není zpětně kompatibilní s ASCII jako UTF-8. Navíc trpí větším problémem - dost lidí si myslí, že UTF-16 reprezentuje znaky dvěma bajty (tedy jako UCS-2) a vůbec neřeší to, že některé znaky jsou reprezentovány větším množstvím bajtů. Takže ono to v 90% případů bude nějak chodit, ale potom se aplikace nasadí někde v Asii a začne to divně haprovat. Jo a BOM je kapitola sama pro sebe :-)