Mojibake: nepareizi attēloti simboli, rakstzīmju kodējuma problēma

Mojibake — kā un kāpēc rodas nepareizi attēloti simboli, rakstzīmju kodējuma kļūdas un praktiski risinājumi (Unicode/UTF-8) jūsu teksta pareizai attēlošanai.

Autors: Leandro Alegsa

Mojibake (文字化け, izrunā /modʑibake/) ir termins, kas apraksta nepareizi vai nelasāmi attēlotas rakstzīmes — bieži redzamas kā nejauši simboli, jautājuma zīmes, kvadrāti vai latīņu burti ar dīvainiem prefiksiem. Tas notiek, ja datora programmatūra vai sistēma nespēj pareizi atšifrēt teksta baitu secību, jo izmantots cits rakstzīmju kodējums nekā tas, kādu programma sagaida.

Digitālajā tekstā katra rakstzīme tiek pārvērsta noteiktā baitu secībā pēc konkrēta rakstzīmju kodējuma (charset) — piemēram, ISO‑8859‑1, Windows‑1252, Shift_JIS, GB2312 u.c. Ja teksta baiti, kas pieder vienam kodējumam, tiek interpretēti kā cits kodējums, ekrānā parādās nepareizi simboli. Piemēram, vārds “é” kodēts UTF‑8 (baitu secība c3 a9) un, ja šo secību pārlasa kā ISO‑8859‑1, ekrānā parādīsies “é”.

Unicode tika izstrādāts, lai vienkāršotu dažādu rakstzīmju attēlošanu vienotā telpā — tas piešķir katrai rakstzīmei unikālu kodpunkta numuru. UTF‑8, UTF‑16 un UTF‑32 ir veidi, kā šos Unicode kodpunktus saglabāt baitu secībā (enkodēt). UTF‑8 ir visizplatītākā enkodēšana tīmeklī; tā kodē populārākās rakstzīmes ar 1–3 baitu, bet sarežģītākus simbolus — līdz 4 baitiem, nevis «2 baitos» kā reiz teikts nepareizi.

Parastie iemesli mojibake rašanās

  • Trūkst vai nepareiza informācija par kodējumu: pārlūkprogramma, serveris vai datubāze neatsūta/nesatur pareizu Content-Type ar charset, vai HTML lapā nav .
  • Sistēmu vai lietojumprogrammu pievienojumu nekonsistence: fails saglabāts vienā kodējumā, bet atvērts citā (piemēram, saglabāts kā Windows‑1252, bet atvērts kā UTF‑8).
  • Dubultā enkodēšana: teksts jau bija UTF‑8, bet to nejauši pārrakstīja vai pārkodēja, radot divkāršu enkodēšanu.
  • Nesaderīgs fonts vai trūkstošas glifi: pareizs kodējums, bet fonts nesatur nepieciešamo rakstzīmi — tad redzami tukši kvadrāti vai aizstājējzīmes.
  • BOM (Byte Order Mark) problēmas: UTF‑8 BOM (baiti EF BB BF) dažkārt tiek nepareizi interpretēts un rada liekus simbolus lapas sākumā.

Bieži redzami piemēri

  • "é" vai "ä" — parasti UTF‑8 baiti izlasīti kā ISO‑8859‑1 vai Windows‑1252.
  • "Пох" — tipisks piemērs, kad kirilicas teksta UTF‑8 baiti lasīti kā Windows‑1251 vai Windows‑1252, radot virkni latīņu simbolu.
  • Tukši kvadrāti vai jautājuma zīmes — bieži fonts nesatur simbolu.

Kā diagnosticēt

  • Pārbaudiet HTML lapas vai HTTP atbildes galveni: jābūt pareizam Content-Type ar charset=utf-8 (vai attiecīgo kodējumu).
  • Atveriet failu teksta redaktorā, kas ļauj izvēlēties atvēršanas kodējumu, un izmēģiniet dažādus kodējumus (UTF‑8, Windows‑1252, ISO‑8859‑1, Shift_JIS u.c.).
  • Skatiet faila baitus heksadecimālā veidā (hexdump), lai saprastu, kādi baiti faktiski ir saglabāti.
  • Izmantojiet rīkus kā iconv, enca, uchardet vai tiešsaistes dekoderus, lai noteiktu un pārvērstu kodējumu.

Kā novērst mojibake

  • Standartizējiet uz Unicode (visbiežāk UTF‑8) visos slāņos: faili, HTTP galvenes, datubāzes savienojumi, e‑pasta galvenes utt.
  • Pārliecinieties, ka HTML/HTTP norāda pareizu kodējumu: <meta charset="utf-8"> vai HTTP galvenē Content-Type: text/html; charset=utf-8.
  • Ja strādājat ar PHP, Python, Java u.c., iestatiet atbilstošu noklusējuma kodējumu un pārliecinieties, ka lasīšana/ierakstīšana izmanto pareizu enkodēšanu.
  • Datubāzēs (piemēram, MySQL) iestatiet tabulas un savienojumus uz utf8mb4, lai atbalstītu visu Unicode rakstzīmju kopu.
  • Ja faili jau ir sagrozīti, izmantojiet pārkodēšanas rīkus (piem., iconv) vai redaktoru atbalsta pārkodēšanu, lai atjaunotu sākotnējo tekstu.
  • Izvairieties no liekas BOM izmantošanas, ja sistēma to negaida.
  • Risiniet fontu jautājumus, nodrošinot fontu, kas satur vajadzīgās rakstzīmes, vai ļaujot fontu aizvietošanu (font fallback).

Padomi izstrādātājiem un satura veidotājiem

  • Vienmēr glabājiet avota failus un datubāzi vienotā kodējumā (ieteicams UTF‑8).
  • Testējiet saskarsmes starp sistēmām: e‑pasts, API, CSV/TSV failu importi bieži rada kodēšanas konfliktus.
  • Dokumentējiet, kāds kodējums tiek lietots (piem., projekta README), lai citi izstrādātāji to nepārkodu.
  • Izmantojiet validācijas un automatizētus testus, kas pārbauda, vai nav parādījušās neparastas rakstzīmes vai aizstājējzīmes.

Mojibake nav tehniski jauns jautājums — tas pastāv tik ilgi, cik pastāv dažādi rakstzīmju kodējumi. Tomēr vienota Unicode izmantošana, rūpīga galveņu un metadatu vadība un pareiza rīku lietošana padara to viegli novēršamu mūsdienu vidē.



Tā var izskatīties tīmekļa vietne, ja tiek izmantota nepareiza fontu kodēšana.Zoom
Tā var izskatīties tīmekļa vietne, ja tiek izmantota nepareiza fontu kodēšana.

Japāņu Vikipēdijas rakstā par Mojibake ir izmantota UTF-8 kodēšana. Šis ekrānšāviņš parāda, kā tas izskatās, ja tas ir atšifrēts, izmantojot standarta Windows CP1252 kodējumu.Zoom
Japāņu Vikipēdijas rakstā par Mojibake ir izmantota UTF-8 kodēšana. Šis ekrānšāviņš parāda, kā tas izskatās, ja tas ir atšifrēts, izmantojot standarta Windows CP1252 kodējumu.

Vārda izcelsme

Mojibake ir japāņu vārds. Vārds 文字化け ([moʥibake]) sastāv no divām daļām. 文字 (moji) nozīmē burtu, raksturu. 化け (bake) no darbības vārda 化ける (bakeru) nozīmē parādīties pārģērbies, iegūt formu, mainīties uz sliktāku pusi. Burtiski tas nozīmē "rakstura mutācija".



Jautājumi un atbildes

J: Kas ir "mojibake"?


A: "Mojibake" ir termins, ar ko apzīmē nepareizas un nelasāmas rakstzīmes, kas parādās, ja datora programmatūra nespēj pareizi attēlot tekstu.

J: Kā tiek kodēts teksts, lietojot datoru?


A: Teksts tiek kodēts, izmantojot rakstzīmju kodējumu, kur katra rakstzīme tiek aizstāta ar tās pozīciju vai numuru kodējumā.

J: Kas notiek, ja, pārsūtot tekstu, nav norādīta sākotnējā kodēšana?


A: Ja nav norādīta sākotnējā kodēšana, var tikt izmantota cita rakstzīme, kad skaitlis tiek aizstāts ar rādīšanai paredzēto rakstzīmi.

J: Kas ir Unicode un kā tas atrisina šo problēmu?


A: Unicode ir rakstzīmju kodēšanas standarts, kas var attēlot lielāko daļu rakstzīmju divos baitos. Tas atrisina problēmu, kas saistīta ar dažādu rakstzīmju kodējumu izmantošanu, un nodrošina, ka rakstzīmes tiek attēlotas pareizi.

J: Kādi ir piemēri citām rakstzīmju kodēm, kas tika izmantotas pirms Unicode?


A: ISO-8859 ir vēl vienas rakstzīmju kodēšanas piemērs, kas tika izmantots pirms Unicode.

J: Cik daudz dažādu kodējumu ietver ISO-8859?


A: ISO-8859 ietver 15 dažādas kodēšanas.

J: Vai ISO-8859 īpašās rakstzīmes ir vienādas visās ISO-8859 kodējumos?


A: Nē, ISO-8859 īpašās rakstzīmes katrā kodējumā ir reģistrētas atšķirīgi.


Meklēt
AlegsaOnline.com - 2020 / 2025 - License CC3