Введение
Моджибаке (文字化け, "трансформация символов") — это искажённый или бессмысленный текст, возникающий в результате декодирования текста с использованием неверной кодировки символов. Результатом является систематическая замена символов совершенно не связанными с ними, часто из другой системы письменности. При этом отображение может включать в себя универсальный символ замены ("�") в местах, где двоичное представление считается недопустимым. Замена также может затрагивать несколько последовательных символов, как они выглядят в одной кодировке, если тот же двоичный код представляет собой один символ в другой кодировке. Это происходит из-за различий в кодировках фиксированной длины (например, азиатских 16-битных кодировок по сравнению с европейскими 8-битными кодировками) или использования кодировок переменной длины (в частности, UTF-8 и UTF-16). Некорректное отображение глифов из-за отсутствующих шрифтов или глифов в шрифте — это отдельная проблема, которую не следует путать с моджибаке. Признаками некорректного отображения являются блоки с указанием кодовой точки в шестнадцатеричном формате или использование универсального символа замены. Важно отметить, что эти замены допустимы и являются результатом корректной обработки ошибок программным обеспечением.
Mojibake (文字化け; , "character transformation") is the garbled or gibberish text that is the result of text being decoded using an unintended character encoding. The result is a systematic replacement of symbols with completely unrelated ones, often from a different writing system. This display may include the generic replacement character ("�") in places where the binary representation is considered invalid. A replacement can also involve multiple consecutive symbols, as viewed in one encoding, when the same binary code constitutes one symbol in the other encoding. This is either because of differing constant length encoding (as in Asian 16 bit encodings vs European 8 bit encodings), or the use of variable length encodings (notably UTF 8 and UTF 16). Failed rendering of glyphs due to either missing fonts or missing glyphs in a font is a different issue that is not to be confused with mojibake. Symptoms of this failed rendering include blocks with the code point displayed in hexadecimal or using the generic replacement character. Importantly, these replacements are valid and are the result of correct error handling by the software.
Недостаточное описание
Если кодировка не указана, программное обеспечение должно определить её другими способами. В зависимости от типа программного обеспечения, типичным решением является настройка или эвристические методы определения кодировки. Оба подхода подвержены ошибкам. Кодировка текстовых файлов зависит от локальных настроек, которые, в свою очередь, зависят от языка пользователя, операционной системы и множества других факторов. Поэтому предполагаемая кодировка систематически неверна для файлов, полученных с компьютера с другими настройками, или даже от программного обеспечения, локализованного иначе в той же системе. Для Unicode одним из решений является использование маркера порядка байтов, но для исходного кода и другого машиночитаемого текста многие парсеры это не поддерживают. Другой способ – хранить кодировку как метаданные в файловой системе. Файловые системы, поддерживающие расширенные атрибуты файлов, могут хранить эту информацию как user.charset. Это также требует поддержки со стороны программного обеспечения, желающего использовать эту возможность, но не влияет на работу другого программного обеспечения. Хотя некоторые кодировки легко определить, например UTF-8, многие из них сложно различить (см. определение кодировки). Веб-браузер может не суметь отличить страницу, закодированную в EUC-JP, от страницы, закодированной в Shift-JIS, если кодировка не указана явно с помощью HTTP-заголовков, отправляемых вместе с документами, или с помощью метатегов HTML-документа, которые используются в качестве замены отсутствующим HTTP-заголовкам, если сервер не может быть настроен на отправку правильных HTTP-заголовков; см. кодировки символов в HTML.
Неправильная спецификация
Моджибаке также возникает, когда кодировка указана неверно. Это часто случается между схожими кодировками. Например, почтовый клиент Eudora для Windows был известен тем, что отправлял электронные письма, помеченные как ISO 8859-1, которые на самом деле были в кодировке Windows 1252. Windows 1252 содержит дополнительные печатные символы в диапазоне C1 (наиболее часто встречающиеся – это фигурные кавычки и дополнительные тире), которые некорректно отображались в программном обеспечении, соответствующем стандарту ISO; это особенно влияло на программное обеспечение, работающее в других операционных системах, таких как Unix.
Надзор за пользователями
Среди кодировок, которые до сих пор широко используются, многие возникли путем расширения ASCII, то есть путем добавления символов к нему. В результате, эти кодировки обладают частичной совместимостью друг с другом. Примерами являются Windows 1252 и ISO 8859-1. Поэтому пользователи могут ошибочно принимать расширенный набор символов, который они используют, за обычный ASCII.
Сверхспецификация
Когда используется несколько уровней протоколов, каждый из которых пытается определить кодировку на основе различных данных, наименее достоверная информация может ввести получателя в заблуждение. Например, рассмотрим веб-сервер, отдающий статический HTML-файл по протоколу HTTP. Информация о наборе символов может быть передана клиенту тремя способами: в HTTP-заголовке. Эта информация может основываться на конфигурации сервера (например, при отдаче файла с диска) или контролироваться приложением, работающим на сервере (для динамических веб-сайтов). во файле, как HTML-метатег (http-equiv или charset) или атрибут кодировки в XML-декларации. Это кодировка, в которой автор намеревался сохранить файл. во файле, как метка порядка байтов (BOM). Это кодировка, в которой редактор автора фактически сохранил файл. Если не произошло случайного преобразования кодировки (например, при открытии файла в одной кодировке и сохранении в другой), это будет верно. Однако она доступна только в кодировках Unicode, таких как UTF-8 или UTF-16.
in the HTTP header. This information can be based on server configuration (for instance, when serving a file off disk) or controlled by the application running on the server (for dynamic websites). in the file, as an HTML meta tag (http equiv or charset) or the encoding attribute of an XML declaration. This is the encoding that the author meant to save the particular file in. in the file, as a byte order mark. This is the encoding that the author's editor actually saved it in. Unless an accidental encoding conversion has happened (by opening it in one encoding and saving it in another), this will be correct. It is, however, only available in Unicode encodings such as UTF 8 or UTF 16.
Отсутствие поддержки аппаратной или программной
Более старое оборудование, как правило, разрабатывалось с поддержкой только одного набора символов, и этот набор символов обычно нельзя изменить. Таблица символов, содержащаяся в прошивке дисплея, локализуется для отображения символов, соответствующих стране, в которой устройство будет продаваться, и обычно различается в зависимости от страны. Следовательно, такие системы могут отображать искаженный текст (моджибаке) при загрузке текста, созданного в системе из другой страны. Аналогично, многие ранние операционные системы не поддерживают несколько форматов кодировки и, следовательно, будут отображать искаженный текст, если им потребуется отобразить текст в нестандартной кодировке. Например, ранние версии Microsoft Windows и Palm OS локализованы для каждой страны и поддерживают только стандарты кодировки, актуальные для страны, в которой продается локализованная версия, и будут отображать искаженный текст, если открыть файл, содержащий текст в кодировке, отличной от той, которую поддерживает операционная система.
Резолюции
Приложения, использующие UTF-8 в качестве кодировки по умолчанию, могут достичь большей степени совместимости благодаря его широкому распространению и обратной совместимости с US ASCII. UTF-8 также может быть распознан напрямую с помощью простого алгоритма, поэтому хорошо написанное программное обеспечение должно избегать путаницы UTF-8 с другими кодировками. Сложность устранения моджибека зависит от приложения, в котором он возникает, и от причин его появления. Два наиболее распространенных приложения, в которых может возникнуть моджибек, – это веб-браузеры и текстовые процессоры. Современные браузеры и текстовые процессоры часто поддерживают широкий спектр кодировок символов. Браузеры часто позволяют пользователю изменять настройки кодировки движка рендеринга непосредственно в процессе работы, а текстовые процессоры позволяют пользователю выбрать подходящую кодировку при открытии файла. Подбор правильной кодировки может потребовать проб и ошибок. Проблема усложняется, если она возникает в приложении, которое обычно не поддерживает широкий спектр кодировок символов, например, в компьютерной игре, не использующей Unicode. В этом случае пользователю необходимо изменить настройки кодировки операционной системы, чтобы они соответствовали настройкам игры. Однако изменение системных настроек кодировки также может вызвать моджибек в уже существующих приложениях. В Windows XP и более поздних версиях пользователь также может использовать Microsoft AppLocale – приложение, позволяющее изменять настройки локализации для отдельных приложений. Тем не менее, изменение настроек кодировки операционной системы невозможно в более ранних операционных системах, таких как Windows 98; для решения этой проблемы в более ранних операционных системах пользователю придется использовать сторонние приложения для отображения шрифтов.
Английский
Моджибаке в английских текстах обычно встречается в знаках препинания, таких как длинное тире (—), короткое тире (–) и типографские кавычки (“,”,‘,’), но редко в тексте символов, поскольку большинство кодировок согласуются с ASCII в отношении кодирования английского алфавита. Например, знак фунта стерлингов £ может отображаться как £, если отправитель закодировал его в UTF-8, а получатель интерпретировал как одну из западноевропейских кодировок (CP1252 или ISO 8859-1). Если это повторить, используя CP1252, это может привести к £, £, £, ÃƒÆ’Ã¢â‚¬à ¡Ãƒâ€šÃ‚Â£ и так далее. Аналогично, правая одиночная кавычка (’), закодированная в UTF-8 и декодированная с помощью Windows 1252, становится ’, ’, ’ и так далее. Некоторые компьютеры в прошлом использовали специфические кодировки, разработанные производителями, что также приводило к несоответствиям в английском тексте. 8-битные компьютеры Commodore использовали кодировку PETSCII, особенно примечательную тем, что она меняла местами верхний и нижний регистры по сравнению со стандартным ASCII. Принтеры PETSCII нормально работали на других компьютерах того времени, но инвертировали регистр всех букв. Мейнфреймы IBM используют кодировку EBCDIC, которая вообще не соответствует ASCII.
Центральная и Восточная Европа
Это может также затронуть пользователей языков Центральной и Восточной Европы. Поскольку большинство компьютеров в середине и конце 1980-х годов не были подключены к сети, для каждого языка с диакритическими знаками существовали различные кодировки символов (см. ISO/IEC 8859 и KOI8), которые часто различались даже в зависимости от операционной системы.
Венгерский
На венгерском языке это явление называется betűszemét, что означает «буквенный мусор». Венгерский язык особенно восприимчив, поскольку содержит гласные с диакритическими знаками á, é, í, ó, ú, ö, ü (все присутствуют в наборе символов Latin 1), а также два символа ő и ű, которых нет в Latin 1. Эти два символа могут быть правильно закодированы в Latin 2, Windows 1250 и Unicode. Однако до того, как Unicode стал распространенным в почтовых клиентах, электронные письма, содержащие венгерский текст, часто имели буквы ő и ű, искаженные, порой до неузнаваемости. Обычно в ответ на поврежденное письмо присылают бессмысленную фразу «Árvíztűrő tükörfúrógép» (буквально «Флоудоустойчивая зеркальная дрель»), которая содержит все гласные с диакритическими знаками, используемые в венгерском языке.
Примеры
Венгерский пример Кодирование источника Кодирование цели Результат Происхождение ÁRVÍZTŰRŐ TÜKÖRFÚRÓGÉPárvíztűrő tükörfúrógép UTF 8 Цитируемый печатаемый 7 бит ASCII =C3=81RV=C3=8DZT=C5=B0R=C5=90 T=C3=9CK=C3=96RF=C3=9AR=C3=93G=C3=89P =C3=A1rv=C3=ADzt=C5=B1r=C5=91 t=C3=BCk=C3=B6rf=C3=BAr=C3=B3g=C3=A9p В основном вызван неправильно настроенными почтовыми серверами, но может возникать в сообщениях на некоторых сотовых телефонах, а также в SMS. ISO 8859 2 Цитируемый печатаемый =C1RV=CDZT=DBR=D5 T=DCK=D6RF=DAR=D3G=C9P=E1rv=EDzt=FBr=F5 t=FCk=F6rf=FAr=F3g=E9p CWI 2 CP 437 ÅRVìZTÿRº TÜKÖRFùRòGÉPárvíztűrô tükörfúrógép Кодирование CWI 2 было разработано таким образом, чтобы венгерский текст оставался достаточно хорошо читаемым, даже если устройство на приемном конце использует одну из кодировок по умолчанию (CP 437 или CP 850). Этот код использовался в очень большом количестве в начале 1980-х и начале 1990-х годов, но в настоящее время он полностью устарел. CP 852 ╡RV╓ZTδRè TÜKÖRFΘRαGÉPárvízt√rï tükörfúrógép Это было очень распространено во времена DOS, так как текст часто кодировался с использованием страницы кода 852 ("Центрально-Европейский"), но программное обеспечение на приемной стороне часто не поддерживало CP 852 и вместо этого пыталось отображать текст с использованием CP 437 или CP 850. Малые буквы в основном верны, за исключением ű и ő. Ü/ü и Ö/ö верны, потому что CP 437 и CP 850 были совместимы с немецким языком. Хотя в наши дни это редкость, его все еще можно увидеть в таких местах, как напечатанные рецепты и чеки. CP 850 ÁRVÍZTÙRè TÜKÖRFÚRÓGÉPárvízt¹rï tükörfúrógép Windows 1250 µRVÖZTëRŠ TšKTMRFéRŕG P rvˇztűr‹ tk"rfŁr˘gp Оба кодирования являются центрально-европейскими, но текст кодируется кодированием DOS и декодируется кодированием Windows. Использование ű правильно. Mac Roman µRV÷ZTÎRä TöKôRFÈR‡GêP†rv°zt˚rã tÅkîrf£r¢gÇp Также часто встречается в дни DOS, это можно было увидеть, когда компьютеры Apple пытались отображать венгерский текст, отправленный с помощью DOS или Windows, поскольку они часто подразумевали собственное кодирование Apple. Windows 1250 ¡RVÕZT€R’ T‹K÷RF⁄R”G P·rvÌzt˚rı t¸kˆrf˙rÛgÈp CP 852 ┴RV═ZT█RŇ T▄KÍRF┌RËG╔PßrvÝztűr§ tŘk÷rf˙rˇgÚp Оба кодирования являются центрально-европейскими, но текст кодируется кодированием Windows и декодируется кодированием DOS. Использование ű правильно. Windows 1252 ÁRVÍZTÛRÕ TÜKÖRFÚRÓGÉPárvíztûrõ tükörfúrógép Используется западноевропейское кодирование Windows по умолчанию вместо центральноевропейского. Только ő Ő (õ Õ) и ű Ű (û Û) ошибочны, и текст полностью читаем. Это самая распространенная ошибка в наши дни; из-за незнания она часто встречается на веб-страницах или даже в печатных СМИ. UTF 8 à RVà ZTŰRÅ TÜKÖRFÚRÃ"GÉPárvÃztűrÅ‘ tükörfúrógép В основном вызвано веб-сервисами или веб-почтой, которые настроены неправильно или не протестированы на предмет международной поддержки (поскольку проблема остается скрытой для английских текстов). В этом случае фактическое (часто генерируемое) содержимое находится в UTF 8, но некоторые старые программы могут по умолчанию использовать локализованные кодировки, если UTF 8 не указан явно в заголовках HTML. Mac Roman √ÅRV√çZT≈∞R≈ê T√úK√ñRF√öR√ìG√âP√°rv√≠zt≈±r≈ë t√ºk√∂rf√∫r√≥g√©p
Польский
До создания ISO 8859-2 в 1987 году пользователи различных вычислительных платформ использовали собственные кодировки символов, такие как AmigaPL на Amiga, Atari Club на Atari ST и Masovia, IBM CP852, Mazovia и Windows CP1250 на IBM PC. Польские компании, продававшие ранние компьютеры DOS, создавали собственные, несовместимые друг с другом способы кодирования польских символов и просто перепрограммировали ПЗУ видеокарт (обычно CGA, EGA или Hercules), чтобы обеспечить аппаратные кодовые страницы с необходимыми глифами для польского языка, располагая их произвольно, без учёта расположения у других производителей. Ситуация начала улучшаться, когда, после давления со стороны академических и пользовательских сообществ, ISO 8859-2 стал де-факто "интернет-стандартом" с ограниченной поддержкой в программном обеспечении ведущих поставщиков (сейчас в значительной степени вытеснен Unicode). Из-за многочисленных проблем, вызванных разнообразием кодировок, даже сегодня некоторые пользователи называют польские диакритические знаки "krzaczki" (букв. "маленькие кустарники").
Югославские языки
Хорватский, боснийский, сербский (отделившиеся варианты сербохорватского языка) и словенский добавляют к базовому латинскому алфавиту буквы š, đ, č, ć, ž и их заглавные аналоги Š, Đ, Č, Ć, Ž (только č/Č, š/Š и ž/Ž в словенском языке; официально, хотя другие используются при необходимости, в основном в иностранных именах). Все эти буквы определены в Latin 2 и Windows 1250, в то время как только некоторые (š, Š, ž, Ž, Đ) существуют в стандартной ОС по умолчанию Windows 1252, и присутствуют там из-за других языков. Хотя искажения отображения (Mojibake) могут возникать с любым из этих символов, буквы, не включенные в Windows 1252, гораздо более подвержены ошибкам. Таким образом, даже сегодня "šđčćž ŠĐČĆŽ" часто отображается как "šðèæž ŠÐÈÆŽ", хотя ð, È и Æ никогда не используются в славянских языках. При ограничении базовым ASCII (например, в большинстве имен пользователей) распространены следующие замены: š→s, đ→dj, č→c, ć→c, ž→z (заглавные буквы аналогично, с Đ→Dj или Đ→DJ в зависимости от регистра). Все эти замены вносят неоднозначность, поэтому восстановление оригинала из такой формы обычно выполняется вручную, при необходимости. Кодировка Windows 1252 важна, поскольку английские версии операционной системы Windows наиболее распространены, а не локализованные. Причины этого включают относительно небольшой и фрагментированный рынок, что увеличивает стоимость высококачественной локализации, высокий уровень пиратства программного обеспечения (в свою очередь вызванный высокой ценой программного обеспечения по сравнению с доходами), что препятствует усилиям по локализации, а также предпочтение пользователей английским версиям Windows и другого программного обеспечения. Стремление к разграничению хорватского от сербского, боснийского от хорватского и сербского, а теперь даже черногорского от остальных трех создает множество проблем. Существует множество различных локализаций, использующих разные стандарты и отличающихся по качеству. Нет общепринятых переводов для огромного количества компьютерной терминологии, происходящей из английского языка. В итоге люди используют англицизмы ("компьютер" для "computer", "компилировать" для "compile" и т.д.), и если они не знакомы с переведенными терминами, могут не понять, что подразумевает та или иная опция в меню, исходя из переведенной фразы. Поэтому люди, понимающие английский язык, а также привыкшие к английской терминологии (а их большинство, поскольку английская терминология также в основном преподается в школах из-за этих проблем), регулярно выбирают оригинальные английские версии неспециализированного программного обеспечения. При использовании кириллицы (для македонского и частично сербского языков) проблема аналогична другим кириллическим письменностям. Новые версии английского Windows позволяют изменять кодировку (в более старых версиях требуются специальные английские версии с поддержкой этой функции), но эта настройка может быть и часто была установлена неправильно. Например, Windows 98 и Windows Me можно настроить на большинство однобайтовых кодовых страниц, включая 1250, но только во время установки.
Кавказские языки
В письменных системах некоторых языков Кавказа, включая грузинский и армянский, может возникать моджибак. Эта проблема особенно актуальна для ArmSCII или ARMSCII – устаревшего набора кодировок символов для армянского алфавита, который был вытеснен стандартами Unicode. ArmSCII не получил широкого распространения из-за недостаточной поддержки в компьютерной индустрии; например, он не поддерживается Microsoft Windows.
Азиатские кодировки
Другой тип моджибака возникает, когда текст, закодированный в однобайтовом кодировании, ошибочно интерпретируется в многобайтовом кодировании, например, в одной из кодировок для восточноазиатских языков. При таком виде моджибака одновременно повреждается более одного (обычно двух) символа. Например, если шведское слово kärlek закодировано в Windows 1252, но декодировано с использованием GBK, оно будет отображаться как "k鋜lek", где "är" интерпретируется как "鋜". По сравнению с вышеуказанным моджибаком, это сложнее читать, поскольку буквы, не связанные с проблемными å, ä или ö, отсутствуют, и особенно проблематично для коротких слов, начинающихся с å, ä или ö (например, "än" становится "鋘"). Поскольку две буквы объединяются, моджибак также кажется более случайным (более 50 вариантов по сравнению с обычными тремя, не считая более редких заглавных букв). В некоторых редких случаях, целая текстовая строка, которая случайно содержит последовательность слов определенной длины, например, предложение "Bush hid the facts", может быть неправильно интерпретирована.
Текст индийского языка
Аналогичный эффект может возникать в брахманских или индийских письменностях Южной Азии, используемых в таких индоарийских или индийских языках, как хиндустани (хинди-урду), бенгальский, панджаби, маратхи и других, даже если используемый набор символов правильно распознается приложением. Это происходит потому, что во многих индийских письменностях правила, по которым отдельные символы букв объединяются для создания символов слогов, могут быть неправильно интерпретированы компьютером, не имеющим соответствующего программного обеспечения, даже если глифы для отдельных форм букв доступны. Примером является старый логотип Википедии, который пытался отобразить символ, аналогичный "wi" (первый слог слова "Википедия") на каждой из частей головоломки. Элемент головоломки, предназначенный для отображения символа "wi" в деванагари, вместо этого отображал символ "wa", за которым следовал несвязанный модификатор гласной "i", что легко узнавалось как моджибаке, возникающее на компьютере, не настроенном для отображения индийского текста. Логотип, переработанный в 2010 году, исправил эти ошибки. Концепция простого текста требует, чтобы операционная система предоставляла шрифт для отображения кодов Unicode. Этот шрифт различается в разных операционных системах для сингальского языка и приводит к орфографически неверным глифам для некоторых букв (слогов) во всех операционных системах. Например, 'reph', краткая форма для 'r', является диакритическим знаком, который обычно располагается над основной буквой. Однако его неправильно использовать над некоторыми буквами, такими как "ya" или "la", в определенных контекстах. Для санскритских слов или имен, унаследованных современными языками, таких как कार्य, IAST: kārya, или आर्या, IAST: āryā, его уместно размещать над этими буквами. Напротив, для аналогичных звуков в современных языках, которые возникают в результате их специфических правил, он не размещается над ними, например, в слове करणाऱ्या, IAST: karaṇāryā, – основе слова करणारा/री, IAST: karaṇārā/rī, в языке маратхи. Однако это происходит в большинстве операционных систем. Похоже, это связано с ошибками во внутренней программной реализации шрифтов. В Mac OS и iOS комбинация мурдхаджа 'l' (темная 'l') и 'u', а также ее удлиненная форма, отображаются с неправильной формой. Некоторые индийские и производные от них письменности, в частности лаосская, официально не поддерживались Windows XP до выхода Vista. Однако различные ресурсы предоставляют бесплатные для скачивания шрифты.
Бирманский
Из-за западных санкций и поздней поддержки бирманского языка в компьютерах, в шрифте Завgyi некоторые кодовые точки бирманского письма были реализованы в соответствии со спецификацией Unicode, а другие – нет. Консорциум Unicode называет это неформальными кодировками шрифтов. С распространением мобильных телефонов, производители мобильных устройств, такие как Samsung и Huawei, просто заменили системные шрифты, соответствующие стандарту Unicode, на версии Завgyi. Правительство Мьянмы объявило 1 октября 2019 года "Днём U" для официального перехода на Unicode.
Африканские языки
В некоторых африканских системах письма не закодированный текст нечитаем. Тексты, которые могут приводить к появлению "моджибаке", включают в себя тексты из региона Африканского Рога, такие как письмо геэз в Эфиопии и Эритрее, используемое для языков амхарского, тигре и других, а также сомалийский язык, использующий алфавит Османья. В Южной Африке алфавит мвангвего используется для записи языков Малави, а алфавит мандомбе был создан для Демократической Республики Конго, однако они обычно не поддерживаются. Различные другие системы письма, возникшие в Западной Африке, представляют собой аналогичные проблемы, например, алфавит н’ко, используемый для языков мандинг в Гвинее, и слоговое письмо вай, используемое в Либерии.
Арабский
Другим затронутым языком является арабский (см. ниже), в котором текст становится полностью нечитаемым при несовпадении кодировок.