СЕРВИСНЫЕ УСЛУГИ
СТУДИЯ В ЛИПЕЦКЕ

Советы · Windows · 5 минут

Кириллица ломается в старой программе: ANSI, UTF-8 и язык системы

Как различить кодировку файла, системную локаль, раскладку и шрифт. Проверка старой ANSI-программы, флажка UTF-8 и последствий изменения.
Microsoft Windows: пример показа расширений файлов. Расширение помогает определить формат документа, но само по себе не сообщает его кодировку.

Microsoft Windows: пример показа расширений файлов. Расширение помогает определить формат документа, но само по себе не сообщает его кодировку.
© Microsoft. Used with permission from Microsoft. · источник и условия использования · Microsoft screenshot permissions

Сначала определите, какие именно символы испортились

В старой программе русские буквы превратились в «Рџ…», вопросительные знаки или квадраты. Причины различаются: байты могли прочитать в другой кодировке, данные могли уже сохраниться с потерями либо шрифт не поддерживает нужные символы.

Раскладка клавиатуры определяет ввод. Язык интерфейса Windows определяет переводы элементов системы. Системная локаль влияет на часть старых не-Unicode-программ, а кодировка файла описывает преобразование его байтов в текст. Смена одной из этих настроек не меняет автоматически остальные. [1], [2]

Начните с копии данных. Если проблема в бухгалтерской базе, старом каталоге или проекте, не пересохраняйте его случайным редактором ради проверки: формат может быть двоичным или иметь собственные правила.

Разные уровни работы с текстом
  1. БайтыКак сохранены данные
  2. КодировкаКак из байтов получаются символы
  3. ПрограммаКакую кодовую страницу она ожидает
  4. ШрифтКакими знаками отображаются символы

Схема редакции «Мы из 90х».

Отделите испорченные данные от испорченного отображения

Сравните меню программы, ввод нового текста и открытие старого файла. Если ломается только содержимое одного документа, начните с его происхождения и настроек импорта. Если некорректно всё старое приложение, проверьте его совместимость с текущей кодовой страницей.

Квадраты могут указывать на отсутствие подходящих знаков в шрифте, но один вид картинки не является точным диагнозом. Вопросительные знаки могли быть записаны вместо исходных букв во время прежнего преобразования. Тогда простая смена режима просмотра не вернёт утраченную информацию.

Сохраните оригинальные байты или резервную копию до любых преобразований. «Сохранить как UTF-8» после неправильного чтения может закрепить уже испорченные символы в новой корректно записанной кодировке.

Признак и возможная проверка
НаблюдениеЧто сравнить
Ломается один файлИсходную кодировку и способ импорта
Ломается старая программа целикомЛокаль, ANSI-режим и совместимость
Видны квадратыНаличие символов в шрифте
В оригинале уже сохранены вопросительные знакиБолее раннюю копию данных

Учебная таблица редакции.

Почему слово ANSI недостаточно точно

В старых Windows-программах «ANSI» обычно означает системную кодовую страницу, выбранную для соответствующих интерфейсов. Это не единая универсальная кодировка для всех компьютеров и всех языков.

Для русскоязычных данных часто встречается Windows-1251, а в старых консольных сценариях — OEM-страницы, например 866. UTF-8 использует другое кодирование. Программа должна понимать, какие байты получает.

Unicode-приложение может вообще не зависеть от обычной ANSI-страницы для собственного интерфейса. Кроме того, современная программа может явно выбрать UTF-8 для себя. Microsoft описывает настройку activeCodePage и условия её использования отдельно. [1]

Посмотрите системную локаль и флажок UTF-8 отдельно

Текущее значение локали можно прочитать в PowerShell:

PowerShell

Get-WinSystemLocale

Затем откройте региональные параметры через intl.cpl, перейдите к дополнительным административным настройкам и нажмите изменение языка системы для программ, не поддерживающих Unicode.

Запишите выбранную локаль и состояние флажка Beta: Use Unicode UTF-8 for worldwide language support. Сам вывод ru-RU не заменяет проверку этого флажка: язык и выбор UTF-8 нужно учитывать отдельно.

Изменение системной локали действует на компьютер и требует перезапуска. На рабочем устройстве оно может затронуть несколько старых программ. Сохраните исходное состояние, чтобы проверить один фактор и затем вернуть его. [1], [2], [3]

Что записать перед изменением
НастройкаПочему важна
Текущая системная локальОпределяет контекст старых приложений
Флажок UTF-8Может менять ожидаемую ANSI-страницу
Версия проблемной программыПоддержка зависит от реализации
Формат и происхождение данныхНужно знать ожидаемые байты

Учебная таблица редакции.

Почему включение UTF-8 иногда ломает старую программу

Если приложение рассчитывает на старую кодовую страницу или один байт на символ, новое окружение может нарушить его предположения. Поэтому флажок не является универсальным обновлением всех старых EXE.

Сначала проверьте требования разработчика своей версии. Если программа ожидает русскую системную локаль без UTF-8-режима, сравнение выполняют именно в таких условиях, сохранив исходные настройки и копию данных. Если разработчик поддерживает UTF-8, следуйте его способу включения.

Меняйте один параметр за раз, перезагружайте систему, затем открывайте контрольную копию. Не меняйте одновременно локаль, шрифты, региональный формат и кодировку всей базы — результат станет невозможно объяснить.

Что делает chcp и чего она не меняет

В командной строке команда без параметров показывает активную кодовую страницу консоли:

Командная строка

chcp

Это настройка консольного окружения, а не универсальная смена кодировки графических программ. Команда не перекодирует автоматически существующий текстовый файл или базу данных. Поведение запущенной программы зависит также от её собственной реализации. [4]

Если работаете с перенаправлением вывода в файл, отдельно выясните кодировку, которую использует сама программа и оболочка. Визуально правильная строка на экране не гарантирует, что другой инструмент прочитает сохранённый вывод так же.

Не используйте chcp 65001 как общий рецепт для любого старого приложения с кириллицей. Сначала определите, что именно читает и пишет программа.

Учебный пример: байты UTF-8 прочитали как Windows-1251

Для слова «Привет» можно получить характерное искажение, если его UTF-8-байты ошибочно декодировать как Windows-1251:

Одни байты — разные правила чтения
ШагРезультат
Исходный текстПривет
КодированиеБайты UTF-8
Ошибочное чтение как Windows-1251Привет

Пример вычислен для объяснения кодировок. Это не скриншот неисправности пользователя и не результат испытания Windows.

Учебная таблица редакции.

Если исходные байты сохранены, может помочь правильный режим чтения или импорта. Если искажённый результат уже многократно пересохранён, требуется установить последовательность преобразований и наличие ранней копии.

Не применяйте массовое «исправление кракозябр» ко всему каталогу: часть файлов уже может быть корректной или использовать другую кодировку. Сначала проверьте один известный документ и обратимость выбранного способа.

Проверьте чтение и новую запись отдельно

После одного изменения откройте исходную копию, проверьте несколько известных строк и выполните пробное сохранение в новый файл. Затем закройте программу и откройте результат заново. Для базы используйте штатный экспорт или тестовую копию, а не произвольное перекодирование её файлов.

Сравните другие необходимые старые приложения. Исправление одного сценария не должно незаметно испортить работу соседнего. Если изменение не помогло, верните исходные параметры и сохраните наблюдения.

Для обращения за помощью нужны версия программы, системная локаль, состояние UTF-8-флажка, происхождение документа и точное место искажения: меню, чтение или новая запись. Эти данные позволяют продолжить проверку без угадывания по одной фотографии букв.

Как подтвердить результат
  1. Старый файлПравильно читается контрольная копия
  2. Новая записьСохраняется в выбранном формате
  3. Повторное открытиеТекст остаётся корректным
  4. Другие задачиНужные программы не изменили поведение

Схема редакции «Мы из 90х».

Made on
Tilda