Svaki programer se pre ili kasnije susretne sa situacijom u kojoj potpuno ispravan tekst odjednom postane nečitljiv. Umesto naziva grada Čačak, na ekranu se pojavi ÄaÄak. Umesto prezimena Đorđević, dobijemo ÄorÄeviÄ. Na prvi pogled izgleda kao da su podaci oštećeni, baza pokvarena ili da je došlo do ozbiljne greške u sistemu.
U većini slučajeva problem je mnogo jednostavniji – reč je o pojavi poznatoj kao mojibake.
Šta je zapravo mojibake?
Mojibake je termin japanskog porekla koji označava pogrešan prikaz karaktera nastao kada se tekst zapisan u jednom kodnom rasporedu (encoding-u) pročita kao da je zapisan u drugom.
Drugim rečima, podaci su uglavnom ispravni, ali ih aplikacija tumači na pogrešan način.
Na primer, tekst:
Čačak
može biti sačuvan kao UTF-8, ali ako ga druga aplikacija pročita kao Windows-1250 ili ISO-8859-2, rezultat će biti:
ÄaÄak
Iako izgleda kao besmislen niz znakova, originalni tekst je i dalje prisutan – samo je pogrešno interpretiran.
Zašto nastaje ovaj problem?
Računari ne čuvaju slova, već nizove bajtova. Da bi se ti bajtovi pretvorili u tekst, potrebno je znati po kom pravilu se tumače.
To pravilo naziva se encoding.
Tokom godina korišćeni su različiti standardi:
- ASCII
- ISO-8859-1
- ISO-8859-2
- Windows-1250
- Windows-1251
- UTF-8
- UTF-16
Kada sistem koji koristi jedan encoding razmenjuje podatke sa sistemom koji očekuje drugi encoding, nastaje mojibake.
Gde se najčešće pojavljuje?
Migracija baza podataka
Jedan od najčešćih izvora problema su migracije između različitih sistema:
- Access → MySQL
- SQL Server → PostgreSQL
- Oracle → MySQL
- Stare aplikacije → moderne web platforme
Podaci često godinama postoje u jednoj kodnoj strani, a nova aplikacija očekuje UTF-8.
CSV i Excel fajlovi
CSV fajlovi ne sadrže informaciju o encoding-u, pa Excel često pokušava da „pogodi“ kako treba da ih pročita.
Zbog toga imena gradova, firmi ili osoba mogu završiti kao:
Niš
BeÄej
ÄaÄak
Web aplikacije
Ako server šalje podatke kao UTF-8, a stranica ih očekuje kao Windows-1250, ili obrnuto, korisnik će odmah videti pogrešne karaktere.
API integracije
Kod razmene JSON podataka između sistema, pogrešno definisan encoding može proizvesti stotine ili hiljade neispravnih zapisa.
Kako prepoznati mojibake?
Postoji nekoliko karakterističnih obrazaca:
Ä
Ä
Å¡
ž
Ä
ili:
ÄaÄak
Niš
BeÄej
Ako vidite ovakve kombinacije znakova, gotovo sigurno se radi o encoding problemu.
Da li su podaci izgubljeni?
Dobra vest je da najčešće nisu.
U ogromnom broju slučajeva podaci su potpuno očuvani. Problem je samo u načinu na koji se prikazuju.
Zato se često može izvršiti automatska konverzija i vratiti originalni tekst bez ikakvog ručnog unosa.
Kako sprečiti mojibake?
Koristite UTF-8 svuda
Danas je UTF-8 praktično univerzalni standard.
Najbolja praksa je da svi delovi sistema koriste isti encoding:
- baza podataka
- aplikacija
- API
- CSV eksport
- Excel import
- web stranice
Koristite utf8mb4 u MySQL-u
Za moderne aplikacije preporučuje se:
utf8mb4
jer podržava kompletan Unicode skup karaktera.
Pravilno podesite HTTP zaglavlja
Web aplikacije treba da šalju:
<meta charset="UTF-8">
i odgovarajući HTTP header.
Proverite encoding pre importa
Prilikom uvoza podataka iz:
- Access baza
- CSV fajlova
- Excel dokumenata
- starih ERP sistema
uvek proverite u kom encoding-u su podaci sačuvani pre nego što ih upišete u bazu.
Zašto je problem i dalje toliko čest?
Iako je UTF-8 danas dominantan standard, mnogi poslovni sistemi i dalje koriste tehnologije stare deset ili dvadeset godina. Stare Access baze, ERP sistemi, lokalne aplikacije i razni eksporti često rade sa Windows-1250 ili drugim regionalnim kodnim stranama.
Kada se takvi sistemi povežu sa modernim web aplikacijama, encoding problemi postaju gotovo neizbežni ukoliko se migracija ne planira pažljivo.
Mojibake nije kvar podataka već kvar njihove interpretacije. Kada vidite čudne znakove poput Ä, Å¡ ili Ä, najverovatnije je došlo do neslaganja između encoding-a u kojem su podaci sačuvani i encoding-a u kojem se prikazuju.
Zbog toga je jedno od najvažnijih pravila savremenog razvoja softvera:
Koristite UTF-8 od početka do kraja sistema i proveravajte encoding pri svakoj razmeni podataka.
Na taj način izbeći ćete jedan od najupornijih i najčešćih problema sa tekstualnim podacima u programiranju.
