Mojibake (文字化け, vyslovuje sa /modʑibake/) je názov pre nesprávne, nečitateľné alebo pomýlené znaky, ktoré sa zobrazujú, keď počítačový softvér nezobrazuje text v pôvodnom kódovaní. Počítačový text sa pri uložení alebo prenose prevádza na čísla (kódy znakov) podľa určitého kódovania. Pri spätnom zobrazení sa čísla opäť mapujú na znaky — ak však prijímač použije iné kódovanie, výsledkom sú zle zobrazené znaky (mojibake). Na vyriešenie týchto problémov bol zavedený kód Unicode. Moderné weby a dokumenty bežne používajú UTF-8, ktoré dokáže zakódovať všetky znaky Unicode pomocou 1–4 bajtov, vďaka čomu výrazne znižuje riziko mojibake pri kombinovaní jazykov a písmených sád.

Prečo vzniká mojibake

  • Nesúlad kódovaní: najčastejší dôvod — text bol uložený v jednom kódovaní (napr. Windows‑1250 alebo UTF‑8), ale číta sa v inom (napr. ISO‑8859‑1). Pri nesprávnej interpretácii bytových sekvencií vzniknú zbytočné znaky alebo kombinácie ako „é“ namiesto „é“.
  • HTTP alebo HTML hlavičky chýbajú alebo sú nesprávne: ak webový server neposiela správny Content‑Type/chset alebo dokument neobsahuje <meta charset="...">, prehliadač môže zvoliť nesprávne kódovanie.
  • BOM (Byte Order Mark): niektoré editory pridávajú BOM do začiatku UTF‑8 súboru; to môže spôsobiť problémy v prostrediach, ktoré s BOM nepočítajú (napr. pri PHP hlavičkách).
  • Nesprávne nastavenia databázy alebo spojenia: ak údaje uložíte v jednom kódovaní a pri dotaze sa používa iné (napr. uložené vo Windows‑1250, pripojenie číta ako UTF‑8), vložený alebo načítaný text sa poškodí.
  • Chýbajúce alebo nevhodné fonty: niekedy „znak“ neexistuje vo font‑sade a systém zobrazí prázdny obdĺžnik (tzv. tofu) alebo nahradí ho podobným znakom, čo môže pôsobiť ako nečitateľné.
  • Chyby pri preklade medzi kódovaniami: opakované nesprávne prekonvertovanie súborov (napr. z UTF‑8 do Latin1 a späť) môže text trvalo poškodiť.

Typický príklad (prepojenie medzi bytom a znakom)

Ak máte písmeno „é“ (Unicode U+00E9), v UTF‑8 sa kóduje ako dve byty: C3 A9. Ak tieto dva byty prečíta interpretácia ISO‑8859‑1 ako dva samostatné znaky, zobrazia sa ako „é“. Tak vzniká bežné mojibake.

Ako diagnostikovať problém

  • Skontrolujte HTTP hlavičky (v prehliadači: DevTools → Network → predmetný súbor → Response Headers) – hľadajte Content-Type a charset.
  • Skontrolujte HTML dokument: obsahuje <meta charset="utf-8"> alebo inú deklaráciu?
  • Zistite, v akom kódovaní je súbor uložený (editory ako Notepad++, VS Code, alebo príkazy file -i, enca, chardet na Linuxe).
  • Ak ide o databázu, skontrolujte kódovanie stĺpcov/tabuliek a kódovanie spojenia (napr. MySQL: SHOW VARIABLES LIKE 'character_set_%';).
  • Vyskúšajte dočasne prepísať iné kódovanie v prehliadači (View → Encoding) — ak sa text opraví, viete, ktoré kódovanie je pôvodné.

Praktické opravy

  • Webové stránky: vždy posielajte správnu HTTP hlavičku a deklarujte charset v HTML. Odporúčanie: používať utf-8 všade:
    • HTTP: Content-Type: text/html; charset=utf-8
    • HTML: <meta charset="utf-8">
  • Súbory a editory: v textovom editore (Notepad++, VS Code, Sublime) prepíšte alebo uložte súbor ako UTF‑8 (najlepšie bez BOM pre web a skripty). Pozor: ak súbor už zobrazuje mojibake, pred uložením zistite pôvodné kódovanie a správne ho skonvertujte.
  • Konverzia súborov: použite nástroje ako iconv alebo recode:
    • Príklad: iconv -f WINDOWS-1250 -t UTF-8 input.txt -o output.txt
    • Ak UTF‑8 bol interpretovaný ako ISO‑8859‑1, opraviť to môžete napr. iconv -f ISO-8859-1 -t UTF-8 (alebo nástroj recode).
  • Databázy: použite Unicode kódovanie tabuliek (napr. utf8mb4 v MySQL) a pri pripojení nastavte charset (napr. mysqli_set_charset alebo PDO DSN charset=utf8mb4 alebo SQL SET NAMES 'utf8mb4').
  • SMTP / e‑maily: zabezpečte MIME hlavičky s Content-Type: text/plain; charset="utf-8" a správne kódovanie (base64 alebo quoted‑printable) podľa potreby.
  • Fonty: ak chýbajú niektoré písma, nainštalujte alebo použite font, ktorý obsahuje požadované znaky (napr. Noto fonts od Google pokrývajú veľké množstvo písmených sád).

Oprava poškodeného textu — postup

  • Zálohujte pôvodný súbor (niekedy sa dá poškodenie ešte zhoršiť ďalšími konverziami).
  • Zistite pravdepodobné pôvodné kódovanie (napr. pre Central European: Windows‑1250 alebo ISO‑8859‑2; pre západnú Európu: Windows‑1252 alebo ISO‑8859‑1).
  • Vyskúšajte konverziu späť do UTF‑8 pomocou iconv a otvorte výsledok v editore s UTF‑8.
  • Ak nepoznáte pôvodné kódovanie, pomôžu nástroje na detekciu (enca, chardet) alebo manuálne skúšanie typických kódovaní.

Najlepšie praktiky (pre vývojárov a správcov obsahu)

  • Používajte UTF‑8 všade: súbory, databázy, HTTP hlavičky, e‑maily.
  • Nastavte editor a systém tak, aby implicitne ukladali v UTF‑8 (bez BOM pre webové skripty).
  • Testujte importy a exporty dát medzi systémami (napr. CSV import) – vždy si overte nastavené kódovanie.
  • Používajte Unicode‑aware knižnice a funkcie namiesto starších „byte‑oriented“ funkcií.
  • Pri migrácii starších dát starostlivo plánujte konverziu a overujte výsledky na malom vzorku pred hromadným prepisom.

Mojibake je zvyčajne symptóm nesúladu medzi dvoma systémami, ktoré nehovoria rovnakým „jazykom“ kódovania. Keď pochopíte, v akom kódovaní sú dáta uložené a aké kódovanie očakáva klient, môžete text zvyčajne obnoviť alebo zabrániť ďalšiemu vzniku takýchto chýb použitím Unicode (UTF‑8) a správnych deklarácií kódovania.