Mojibake (文字化け, tariama /modʑibake/) – taip vadinami neteisingi arba neįskaitomi simboliai, kurie atsiranda, kai kompiuterinė programinė įranga nesugeba tinkamai dekoduoti teksto baitų į simbolius. Tekstas skaitmeniniu pavidalu saugomas kaip baitų seka, o kiekvienas simbolis atitinka tam tikrą skaitinę reikšmę pagal pasirinktą simbolių koduotę. Dekodavimo metu baitai turi būti interpretuojami pagal tą pačią koduotę — jei tai neįvyksta, vietoj laukiamo simbolio ekrane atsiranda klaidingi ženklai, t. y. mojibake. Siekiant sumažinti šias problemas, buvo sukurtas Unikodas, o dažniausiai naudojama jo atmaina – UTF-8 (UTF‑8 naudoja kintamą baitų ilgį: 1–4 baitai, ASCII simboliai užkoduojami 1 baitu, dauguma Europos raidžių – 2 baitais, kiti simboliai – 3 arba 4 baitais).
Prieš Unicode pritaikymą egzistavo daug skirtingų koduočių, pvz., ISO-8859 serija (ISO-8859-1…ISO-8859-15) arba Windows-1252, Shift_JIS ir kt. Tos koduotės naudoja tas pačias baitų reikšmes skirtingiems simboliams, todėl vienos koduotės baitai, interpretuojami kitokios koduotės pagrindu, rodo neteisingus ženklus.
Dažniausios priežastys
- Neteisingai nurodyta arba trūkstanti koduotė: neteisingas HTTP antraštės Content-Type arba HTML faile.
- Failas išsaugotas kitoje koduotėje nei nurodyta: pvz., tekstas išsaugotas Windows‑1252, bet naršyklė mano, kad tai UTF‑8.
- Duomenų bazės ir prisijungimo koduotės neatitikimas: duomenys įrašyti viena koduote, o skaitomi kita (pvz., įrašyta latin1, skaitoma kaip utf8).
- Dvigubas kodavimas (double-encoding): tekstas jau buvo UTF‑8 ir vėl paverstas į UTF‑8, galutinį baitų rinkinį interpretuoja kita koduotė.
- Trūkstami simbolių rinkiniai arba šriftai: jei trūksta konkretaus simbolio šrifte, gali būti rodomas pakeitimo simbolis arba langelis.
- Transporto kanalo pakeitimai: el. laiškai, failų perdavimas ar senos API gali keisti arba neteisingai interpretuoti baitus.
Kaip diagnozuoti
- Patikrinkite HTTP antraštes naršyklėje (Network → Response headers): ar yra Content-Type: text/html; charset=...?
- Patikrinkite HTML <meta charset="..."> antraštę (ji turi būti kuo aukščiau <head>).
- Atidarykite failą teksto redaktoriuje, kuris leidžia keisti ir matyti koduotę (pvz., Notepad++, VS Code) ir išbandykite skirtingas interpretacijas.
- Peržiūrėkite baitų reikšmes heksu formatu (pvz., hexdump) — taip aiškiau matyti, kokie tikrieji baitai yra faile.
- Naudokite įrankius aptikimui: chardet/uchardet, enca, arba internetinius dekoderius.
Praktiniai sprendimai
- Nustatykite UTF‑8 kaip standartą: rekomenduojama visas naujas sistemas ir failus naudoti UTF‑8 (geriausia – utf8mb4 MySQL atveju, jei reikia emoji palaikymo).
- Siųskite teisingą antraštę: pvz., PHP:
header('Content-Type: text/html; charset=utf-8'); - Įdėkite meta žymą:
<meta charset="utf-8">— tai leidžia naršyklei žinoti, kaip dekoduoti puslapį. - Saugokite failus teisinga koduote: teksto/šablonų failus, CSV ir pan. išsaugokite kaip UTF‑8 be BOM (BOM kartais sukelia problemų).
- Konfigūruokite duomenų bazę ir ryšį: užtikrinkite, kad lentelių collation ir DB prisijungimo charset sutaptų (pvz., MySQL:
ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;ir naudokiteSET NAMES 'utf8mb4'arba atitinkamą prisijungimo parametrą). - Naudokite konvertavimo įrankius: jei turite failų neteisingoje koduotėje, juos galima konvertuoti, pvz.:
iconv -f WINDOWS-1252 -t UTF-8 input.txt > output.txtarba PHP:$fixed = mb_convert_encoding($bad, 'UTF-8', 'Windows-1252'); - Ištaisykite dvigubą kodavimą: jei tekstas atrodo kaip "é" vietoje "é", reiškia UTF‑8 baitai buvo interpretuoti kaip ISO-8859-1/Windows-1252. Tokiu atveju pabandykite konvertuoti iš to tarpinio kodo į UTF‑8 (pvz., mb_convert_encoding($text, 'UTF-8', 'ISO-8859-1')).
Patikros ir prevencijos
- Standartizuokite projektą: visi įrankiai, CI ir redaktoriai turi naudoti tą pačią koduotę (pvz., UTF‑8).
- Patikrinkite failų importo/eksporto procesus (CSV, XML, API) — nurodykite koduotę aiškiai ir testuokite su specialiais simboliais.
- Sekite testus, kurie įkelia simbolius iš skirtingų kalbų ir patikrina, ar jie be klaidų rodomi UI.
- Dokumentuokite, kokia koduotė naudojama duomenų bazėje ir API, kad komanda neįvestų klaidingų prielaidų.
Trumpai: mojibake dažniausiai kyla dėl koduočių neatitikimo tarp to, kaip tekstas buvo užkoduotas, ir to, kaip jis dekoduojamas. Paprastas sprendimas daugeliu atvejų – pereiti prie vieningos koduotės (UTF‑8), aiškiai nurodyti ją antraštėse ir užtikrinti, kad visi sistemos komponentai (failai, serveris, DB, API) veiktų toje pačioje koduotėje.


