Откъде идват думите
В България нечетимите символи обикновено наричат „йероглифи“ – „йероглифи вместо кирилица“, „странни символи“ или „въпросителни вместо букви“. На английски и в повечето други езици се казва mojibake (文字化け): на японски „moji“ е „символ“, а „bake“ – „превръщане“. През 90-те години японските компютри използваха едновременно Shift_JIS, EUC-JP и ISO-2022-JP и развалените имейли бяха нещо обичайно. При кирилицата историята е подобна: Windows-1251, KOI8-R и DOS кодиранията дълго са съществували паралелно.
Как възникват йероглифите
Компютърът пази текста като байтове. Кодирането определя на коя буква съответства всеки байт. В UTF-8 буквата З заема два байта: D0 97. Програма, която ги чете като Windows-1251, показва по един символ за всеки байт: Р вместо D0 и — вместо 97.
На тази стъпка нищо не се губи – байтовете са на мястото си, просто са прочетени грешно. Затова йероглифите обикновено могат да се върнат в нормален вид: Mojibuster превръща грешните символи обратно в байтове и ги чете в правилното кодиране.
Йероглифи
Здравей! Срещата е в петък от 15:00, стая 204. Ъгълът на улицата е тъмен.
След поправката
Здравей! Срещата е в петък от 15:00, стая 204. Ъгълът на улицата е тъмен.
Какви йероглифи има
Здравей– UTF-8, прочетен като Windows-1251. Най-честият случай, например в Excel: йероглифи в Excel.Çäðàâåé– текст в Windows-1251, показан в западноевропейско кодиране. Повече: Windows-1251 към UTF-8.ъДТБЧЕК– текст в KOI8-R, прочетен като Windows-1251. Среща се в стари имейли и файлове от Unix сървъри.????– буквите вече са заменени с въпросителни. Тях, за съжаление, не може да се възстановят.
Mojibake на други езици
- Японски:
縺薙s縺ォ縺。縺ッвместоこんにちは– UTF-8, прочетен като Shift_JIS. Повече на японската страница. - Китайски:
浣犲ソвместо你好– UTF-8, прочетен като GBK. На китайски се нарича 乱码 (luànmǎ, „хаотичен код“). - Западни езици:
é,ñили€вместоé,ñили€– най-разпространената форма в света.
Типични причини
- Excel отваря CSV в UTF-8 без BOM в кодиране Windows-1251.
- Връзката с базата данни използва
cp1251илиlatin1, а данните са в UTF-8. - Сайт или имейл посочва грешен
charset. - Стари файлове в Windows-1251 или KOI8-R се отварят в програма, която очаква UTF-8.
- Вече развален текст се прекодира още веднъж – получават се двойни йероглифи.
Винаги ли може да се поправи?
Почти винаги, докато байтовете са цели. Не може, ако програма е заменила буквите с ? или със символа за заместване � – тогава оригиналната информация е загубена. Mojibuster поправя всичко, което може да се поправи, и съобщава колко места са загубени.
Как да избегнете йероглифите
- Записвайте файловете в UTF-8, а CSV за Excel – във формат CSV UTF-8 (разделен със запетаи).
- Посочвайте кодирането:
<meta charset="utf-8">в HTML,utf8mb4в MySQL и MariaDB. - Прекодирайте текста само веднъж, на границата между две системи.
- При импорт избирайте кодирането сами, вместо програмата да гадае.
Често задавани въпроси
Защо се нарича mojibake?
Това е японска дума (文字化け, „превръщане на символите“). В Япония проблемът е бил толкова чест, че думата преминава в английския и става международен термин.
Повреден ли е файлът, или е вирус?
Не. Йероглифите са проблем с показването, а не вирус, и обикновено данните не са загубени. Файлът просто е прочетен в грешно кодиране.
Каква е разликата между йероглифите и символа �?
Йероглифи като Здравей още съдържат оригиналните байтове и могат да се поправят. Символът � означава, че програмата не е успяла да прочете байт и го е заменила – тази буква е загубена.
Изпраща ли се текстът към сървър?
Не. Mojibuster поправя текста направо в браузъра. Той не се изпраща и не се съхранява никъде.