Legacy-koodit eivät tiedä tällaisesta mitään vaan ne on kirjoitettu oletuksella 1 tavu = 1 merkki. On vähän vaikeaa arvioida miten paljon tämän oletuksen särkyminen rikkoo koodia. Eihän esim. alimerkkijonoihin pääse enää käsiksi suoraan indeksoimalla (esim. tekstirivillä 5 saraketta vakiopaikoissa ja halutaan poimia 4. sarakkeessa oleva numero ja konvertoida se liukuluvuksi). Hyvin tavallinen tehtävä, kun luetaan tekstitiedostosta dataa sisään. Toki voi pitäytyä ASCII-merkistössä mutta entäs kun 2. sarakkeessa lukeekin "Hyvinkää"?
Ihanko varmasti, jos käytetään jotain binääriä (esim. vanha kirjasto), jossa nämä kutsut on inline-optimoitu suoraan assembleriksi? Enää näin ei voi tehdä, jolloin suorituskyky kärsii.
Ehkä toimii, jos todella kutsutaan jotain funktiota mutta monet merkkijonofunktiot on tehty inline-assemblerina. Ei taida toimia, jos on koodattu jokin toiminnallisuus itse käsin.
Legacy-ohjelma, joka ei tiedä UTF-8'sta mitään, näkee nuo enkoodatut pätkät tilanvarauksensa mukaisina hivenen pitempinä pätkinä. Pääsääntöisesti tuo ei haittaa mitään. Esimerkiksi tuota tekstitiedostoa (vaikka CSV) parsiessa etsit jonkinlaisia column-markereita, joilla jaat tekstin sarakkeiksi. Nuo löytyvät ihan samalla tavalla kuin ennenkin. Se "hyvinkää" parsiutuu sieltä ihan oikein. strlen() palauttaa sille oikean tilanvarauksen mukaisen arvon, jolla voi tarvittaessa varata oikean määrän muistia. Ja vaikka strncpy kopioi sen varattuun bufferiin oikein, vaikka sovellus ei ole ikinä unicodesta kuullutkaan. Ja ei haittaa, vaikka kaikki nuo olisi inlinetetty binääriin, se strlen on edelleen ihan sama toteutus.
Sitten jos sulla on vaikka legacy tekstieditori, niin toki sillä saa generoitua rikkinäisiä utf-8 payloadeja: menet vaikka lisäämään välilyönnin keskelle tuollaista enkoodattua blobia. Mutta niiden esimerkiksi deletoiminen tai copy-paste toimii ihan oikein. Tällainen käyttötapaus sopii hyvin tilanteeseen, jossa tiedoston payload on pääasiassa ASCII, mutta voi sisältää pieniä määriä muita merkkejä.