Mojibake — simbolių koduotės klaida: priežastys ir sprendimai
Sužinokite, kas sukelia mojibake (simbolių koduotės klaidas) ir kaip jas greitai ištaisyti: UTF‑8, koduotės konvertavimas, praktiniai patarimai ir paprasti sprendimai.
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.

Taip gali atrodyti svetainė, jei naudojama netinkama šrifto koduotė.

Japonų Vikipedijos straipsnyje apie Mojibake naudojama UTF-8 koduotė. Šioje ekrano nuotraukoje parodyta, kaip jis atrodo iššifruotas naudojant standartinį "Windows" CP1252 kodavimą.
Žodžio kilmė
"Mojibake" yra japoniškas žodis. Žodis 文字化け ([moʥibake]) sudarytas iš dviejų dalių. 文字 (moji) reiškia raidę, simbolį. 化け (bake) iš veiksmažodžio 化ける (bakeru) reiškia pasirodyti persirengus, įgauti pavidalą, pasikeisti į blogąją pusę. Pažodžiui tai reiškia "charakterio mutaciją".
Klausimai ir atsakymai
K: Kas yra "mojibake"?
A: "Mojibake" - tai terminas, kuriuo vadinami neteisingi ir neįskaitomi simboliai, atsirandantys, kai kompiuterio programinė įranga nesugeba teisingai atvaizduoti teksto.
K: Kaip koduojamas tekstas, kai naudojamasi kompiuteriu?
A: Tekstas koduojamas naudojant simbolių kodavimą, kai kiekvienas simbolis pakeičiamas jo padėtimi arba numeriu kodavime.
K: Kas atsitinka, kai perduodant tekstą nenurodoma pradinė koduotė?
A: Kai originali koduotė nenurodyta, gali būti naudojamas kitas simbolis, kai skaičius pakeičiamas rodomu simboliu.
K: Kas yra "Unicode" ir kaip jis išsprendžia šią problemą?
A: Unikodas yra simbolių kodavimo standartas, pagal kurį daugumą simbolių galima atvaizduoti dviem baitais. Juo išsprendžiama skirtingų simbolių kodavimų naudojimo problema ir užtikrinama, kad simboliai būtų rodomi teisingai.
K.: Kokie yra kitų simbolių kodų, naudotų prieš "Unicode", pavyzdžiai?
A: ISO-8859 yra kito simbolių kodavimo, naudoto prieš "Unicode", pavyzdys.
K: Kiek skirtingų kodavimų yra ISO-8859?
A: ISO-8859 yra 15 skirtingų kodų.
K: Ar ISO-8859 specialieji simboliai yra vienodi visose koduotėse?
A: Ne, ISO-8859 specialieji simboliai kiekvienoje koduotėje pateikiami skirtingai.
Ieškoti