Mojibake – kaj je, vzroki in rešitve v kodiranju znakov Unicode
Mojibake (文字化け, izgovori se /modʑibake/) je pojav neberljivih, “pokvarjenih” znakov, ki nastane, ko je besedilo zapisano v enem kodiranju, prikazano pa z drugim. Tipični znaki so npr. “é”, “Å¡”, “ö”, “Ð�”, verižice kot “😅”, ali nadomestni simbol “�”. Do tega pride, ko računalniška programska oprema napačno domneva kodno stran ali jo uporabnik/sistem nepravilno nastavi.
Kaj se dogaja v ozadju
Besedilo je v računalništvu zapisano kot zaporedje bajtov. Kodiranje znakov določa preslikavo med kodnimi točkami (številkami za posamezne znake) in temi bajti. Ob zapisu se znaki pretvorijo v bajte; ob branju se bajti pretvorijo nazaj v znake. Če se ob branju uporabi drugo kodiranje, kot je bilo uporabljeno ob zapisu, nastanejo napačne preslikave – mojibake. Včasih programska oprema ne pozna izvornega kodiranja in ugiba; drugič je kodiranje sicer znano, a se vmesni korak (npr. kopiranje, uvoz/izvoz) izvede z drugačnimi nastavitvami. Če preslikava sploh ni mogoča, se pogosto vstavi “nadomestni znak” �.
Zgodovinsko ozadje in kodne strani
Pred uvedbo standarda Unicode so bili razširjeni številni, med seboj nezdružljivi nabori znakov (»kodne strani«). Družina ISO‑8859 ima več različnih kodiranj za različne jezike in območja; znaki, običajni v angleščini (osnovni ASCII), so med njimi enaki, “posebni znaki” (č, š, ž, ä, é, ñ, …) pa so razporejeni drugače. Podobno velja za Windows‑1250, Windows‑1252 in druga kodiranja. Mešanje teh kodnih strani (npr. branje besedila v Windows‑1250 kot ISO‑8859‑1) je klasičen vzrok mojibake.
Zakaj Unicode in UTF‑8 pomagata
Unicode definira enoten nabor znakov in kodne točke za praktično vse pisave. UTF‑8 je danes prevladujoče kodiranje za Unicode, ker je združljivo z ASCII in učinkovito: znaki ASCII se kodirajo v 1 bajtu, večina evropskih znakov z diakritiko v 2 bajtih, številni drugi v 3, redkejši (npr. emoji) pa v 4 bajtih. Enotna raba UTF‑8 od vira do prikaza skoraj izniči možnost za mojibake.
Pogosti vzroki mojibake
- Napačno domnevano kodiranje pri odpiranju datoteke (npr. branje UTF‑8 kot ISO‑8859‑1/Windows‑1252).
- Manjkajoče ali napačno deklarirano kodiranje v spletnih odzivih (HTTP Content‑Type, HTML meta).
- Kopiranje/prenos podatkov med sistemi z različnimi privzetimi kodnimi stranmi.
- Dvojno kodiranje ali dvojno razkodiranje (npr. Unicode → UTF‑8 → znova obravnavano kot besedilo in še enkrat prekodirano).
- Nenadzorovano prekodiranje v verigi obdelave (uvoz/izvoz CSV, ETL opravila, API‑ji, logi).
- Neskladje med nastavitvami odjemalca, povezave in baze (npr. MySQL klient, connection, tabela).
- Neustrezna raba BOM (Byte Order Mark); v UTF‑8 je BOM neobvezen in lahko povzroči težave v nekaterih orodjih.
Prepoznavni vzorci in primeri
- Živijo, šumniki! se ob napačnem branju UTF‑8 kot Latin‑1/Windows‑1252 prikaže kot Živijo, Å¡umniki!.
- niño → niño: znak ñ (U+00F1) kot UTF‑8 postane ñ, če ga program zmotno bere kot Latin‑1.
- Emoji ali znaki izven Basic Multilingual Plane postanejo zaporedja kot 😅 (UTF‑8 bajti brani kot enobajtna kodna stran).
- Nadomestni znaki � se pojavijo, ko se bajti ne dajo smiselno preslikati v izbrani nabor.
Kako diagnosticirati težavo
- Ugotovite izvorno kodiranje podatkov (nastavitve izvoza, dokumentacija, HTTP odziv, e‑poštne glave, baza).
- Preglejte HTTP glavo Content‑Type in element
<meta charset="…">
v HTML. - V urejevalniku besedil poskusite odpreti datoteko z različnimi kodiranji (UTF‑8, Windows‑1250/1252, ISO‑8859‑2 …) in preverite, kdaj se znaki prikažejo pravilno.
- Preglejte bajte: sumljivi pari, kot sta C3 89 → “É”, nakazujejo UTF‑8, prebran kot Latin‑1/1252.
- Če sumite na dvojno kodiranje, poskusite najprej razbrati z napačno domnevo, nato pravilno prekodirati v UTF‑8.
Rešitve in preprečevanje
- Standardizirajte na UTF‑8 povsod: v datotekah, API‑jih, bazah, logih, konfiguracijah.
- Vedno deklarirajte kodiranje:
- HTTP: Content‑Type: text/html; charset=UTF‑8 (ali ustrezen MIME tip).
- HTML:
<meta charset="utf-8">
čim višje v dokumentu. - CSV/TSV: dokumentirajte kodiranje; pri uvozu v Excel/Sheets ga izrecno izberite.
- E‑pošta: pravilni MIME headerji (Content‑Type s parametrom charset).
- Ne mešajte kodiranj v isti aplikaciji ali podatkovnem kanalu; dosledno uporabljajte eno.
- Preverite verigo baze podatkov:
- MySQL/MariaDB: uporabite utf8mb4 in ustrezne kolacije (npr. utf8mb4_unicode_ci); nastavite client_encoding/connection collation.
- PostgreSQL: nastavite server_encoding in client_encoding na UTF‑8.
- Izogibajte se BOM v UTF‑8 v kontekstu, kjer povzroča težave (skripte, konfiguracije); za navadne tekstovne datoteke ga običajno ne potrebujete.
- Uporabljajte preizkusne nize z ne‑ASCII znaki (č, š, ž, ä, ñ, Ω, 漢, 🙂) v testih in validaciji.
- Za popravljanje obstoječih podatkov uporabite orodja, kot so iconv, recode, uchardet ali funkcije v urejevalnikih, ki omogočajo ponovno razčlenitev/prekodiranje.
Opomba o normalizaciji in združenih znakih
Mojibake ni isto kot razlike v Unicode normalizaciji (NFC/NFD), kjer je isti znak lahko zapisan kot predpripeti znak ali kot kombinacija osnovnega znaka in diakritike. Normalizacija vpliva na primerjave in razvrščanje, običajno pa ne povzroči “smeti” na zaslonu. Kljub temu je priporočljivo konsistentno normalizirati besedilo v aplikacijah, ki ga obdelujejo ali primerjajo.
Skratka, mojibake skoraj vedno izhaja iz neskladja med kodiranjem pri zapisu in branju. Z dosledno rabo Unicode (UTF‑8), jasnim označevanjem kodiranja in enotnimi nastavitvami v celotni verigi obdelave lahko težavo zanesljivo preprečimo. UTF‑8 kodira vse znake Unicode v 1 do 4 bajtih in je zato danes praktično univerzalna izbira za splet in aplikacije.


Tako je lahko videti spletno mesto, če je uporabljeno napačno kodiranje pisave.


Članek za Mojibake na japonski Wikipediji uporablja kodiranje UTF-8. Ta slika prikazuje, kako je videti, ko ga dekodirate s standardnim kodiranjem Windows CP1252.
Izvor besede
Mojibake je japonska beseda. Beseda 文字化け ([moʥibake]) je sestavljena iz dveh delov. 文字 (moji) pomeni črka, znak. 化け (bake) iz glagola 化ける (bakeru) pomeni pojaviti se v preobleki, prevzeti obliko, spremeniti se na slabše. Dobesedno pomeni "sprememba značaja".
Vprašanja in odgovori
V: Kaj je "mojibake"?
O: Mojibake je izraz za nepravilne in nečitljive znake, ki se pojavijo, ko računalniška programska oprema ne prikaže besedila pravilno.
V: Kako je besedilo kodirano pri uporabi računalnikov?
O: Besedilo je kodirano z uporabo kodiranja znakov, pri čemer je vsak znak nadomeščen s svojim položajem ali številko v kodiranju.
V: Kaj se zgodi, če pri prenosu besedila ni določeno izvirno kodiranje?
O: Kadar izvirno kodiranje ni določeno, se lahko uporabi drug znak, ko se številka nadomesti z znakom za prikaz.
V: Kaj je Unicode in kako rešuje to težavo?
O: Unicode je standard kodiranja znakov, ki lahko večino znakov predstavi v dveh bajtih. Rešuje problem uporabe različnih kodiranj znakov in zagotavlja pravilen prikaz znakov.
V: Kateri so primeri drugih kodiranj znakov, ki so se uporabljali pred Unicode?
O: ISO-8859 je primer drugega kodiranja znakov, ki se je uporabljalo pred Unicode.
V: Koliko različnih kodiranj vsebuje ISO-8859?
O: ISO-8859 vsebuje 15 različnih kodiranj.
V: Ali so posebni znaki v ISO-8859 enaki za vsa kodiranja?
O: Ne, posebni znaki v ISO-8859 so za vsako kodiranje različni.