‘Character encodering detecteren? Deze bibliotheek is een must have.’
Een van de duistere kanten van het leven van een IT’er: de manier van digitaal opslaan en verwerken van teksten. Niets vervelender dan erachter te komen dat er oude standaarden van character encoding zijn gebruikt in een database. Daar loop ik bij dataconversies nog regelmatig tegenaan. Met een beetje pech ben ik dan uren zoet om alles handmatig op te speuren en repareren. Dat kan voorkomen worden. Mijn oproep aan alle applicatiebouwers: gebruik de moderne UTF-8 standaard.
In veel oude databases is de character encoding een rommeltje. En geloof mij, dat kan voor een flinke uitdaging zorgen. De meeste systemen kunnen prima overweg met de letter ‘i’, maar wanneer je er twee puntjes opzet wordt het een ander verhaal. En dat maakt nogal uit wanneer je tussen verschillende systemen moet communiceren. Met de komst van de ASCII standaard leek er een eenduidige manier gevonden. Maar deze 127-karakter tellende standaard is te beperkt. Daarin is geen ruimte voor bijzondere karakters. Gelukkig kwam de internationale UTF-standaard, die tegenwoordig door de meeste systemen wordt gebruikt. Probleem opgelost zou je denken. Máár als je een oudere database hebt, staat alles vaak nog op de oude manier opgeslagen. Daar zit ’t probleem.
Ik loop hier vaak genoeg tegenaan als ik data geleverd krijg van een derde partij. Dan krijg ik een database met bijvoorbeeld leerlingnamen, die op verschillende manieren geëncodeerd zijn. Hoe die namen opgeslagen zijn is ooit veranderd in de applicatie, maar niet goed aangepast in de database. Hierdoor krijg je verschillende varianten van hoe namen verwerkt worden. Heb je een naam met een ‘ş’, dan is daar geen eenduidige vertaling voor. Dat kan zorgen voor uitkomsten als ‘Beg³m Beg��m’. En dan moet je handmatig aan de slag. Ik werk op dit moment met een vertaaltabel waarmee we alle problematische karakters zoeken en vervangen door de correct geëncodeerde variant. Die tabel laten we vervolgens los op de database voordat we de gegevens importeren. Helaas blijven er dan nog een paar namen over die niet goed converteren en dus aangepast moeten worden.
Er zijn ook bibliotheken die je helpen de codering te detecteren. ICU is een goede optie en heeft voor elke programmeertaal een variant. Vooral handig wanneer je te maken hebt met verschillende bronnen en soorten gegevens. De bibliotheek werkt het best met lange teksten. Namen zijn kort, waardoor het niet áltijd helemaal klopt. Maar, het geeft wel de nodige inzichten. Als we terugkijken naar ‘Beg³m Beg��m’, dan zien we via de ICU bibliotheek dat dit voor 72% overeenkomt met ISO-8859-3 of 56% met UTF-8.
Het allerbeste is het natuurlijk als je de codering direct aan de bron fixt. Dus maak je een nieuwe applicatie? Ga dan direct voor UTF-8. Heb je al een bestaande applicatie, voer dan de conversie uit en zorg dat je in UTF-8 opslaat. Gebruik het juiste kolomtype voor tekstuele opslag en sla daar geen andere coderingen in op. Converteer dat en houd het consistent. Dat is even een vervelend werkje, maar de waardering is groot.
Benieuwd naar andere codekrakers? Je checkt ze hier.