In november brachten we jullie al op de hoogte van het feit dat we druk bezig waren met het omzetten van onze standaardtekencodering van latin-9 (ISO-8859-15) naar utf-8. In de afgelopen week al hebben we daarvoor onze database geconverteerd, waarvan jullie als het goed is niets gemerkt hebben. Zojuist is ook onze aangepaste codebase online gegaan en is onze site dus volledig unicode-compliant.
De grootste uitdaging van dit project zat hem in die databaseconversie. Aangezien we natuurlijk liever geen downtime hebben, is hiervoor de pt-online-schema-change tool van percona gebruikt. Deze tool hebben we al eerder met succes gebruikt voor grotere databasewijzigingen en maakt het mogelijk tabelwijzigingen door te voeren terwijl lees- en schrijfoperaties gewoon kunnen blijven worden uitgevoerd.
Daarnaast moest uiteraard onze codebase zelf worden geconverteerd, en moesten in de code zelf alle plekken waar content wordt geoutput en van of naar utf-8 geconverteerd (bijvoorbeeld interfaces met externe systemen), worden aangepast. Over het algemeen bleek dat redelijk eenvoudig door gebruik te maken van PHP's mb_string-functies waar nodig, maar ook waren er een paar lastigere problemen te tackelen; zo moest bijvoorbeeld onze wachtwoordopslag aangepast worden en moest een tussenstap worden toegevoegd om wachtwoorden die nog gehasht zijn, met latin-9 input te kunnen valideren.
We zijn er echter nog niet helemaal. Omdat MySql feitelijk nooit support heeft gehad voor de door ons gebruikte latin-9 codering, is een extra conversie nodig om de verschillen tussen latin-1 en latin-9 nog op te lossen. Dat betreft vooral de weergave van het euroteken, dat door de conversie nu feitelijk in de database een currency symbol (¤) is geworden. Op dit moment wordt dat verschil nog rechtgezet met een stukje code dat al onze output checkt en aanpast, maar ondertussen draait hiervoor een extra conversie op de database om dat allemaal recht te zetten.
Als het goed is merken jullie als bezoeker hier verder weinig van. Het grootste verschil is dat je nu niet meer geconfronteerd wordt met numerieke entiteiten als je bijvoorbeeld je reactie of post aanpast waarin je een 'speciaal teken' had gebruikt. Een 🍺 blijft dus een 🍺 en wordt geen 🍺 😀