Процессор работает на основе сигналов, эти сигналы складываются в блоки, на основе этих блоков процессор интерпретирует некие операции над этими блоками сигналов. В таком ключе все хорошо работает пока не появляется человеческий фактор, а именно человеку нужно взаимодействовать с процессором. На заре компьютеров, Человеку достаточно было отображать сигнал в виде света, если есть сигнал, «лампочка» зажглась, если нет сигнала, «лампочка» не горит, но поскольку такое взаимодействие человека и компьютера, требовало специальных знаний обозначения сигнала (что значит «лампочка» в контексте программы) решено контекст делегировать на компьютер, а то есть на основе естественного языка передавать информацию человеку. С этого момента у программистов появилось новая «головная боль» проблема кодировок естественных языков, одна из первых и старых проблем программирования.
Немного теории
Кодировка символов в памяти и отображения символов на устройстве, это не одно и тоже, кодировка в памяти может быть разной даже в контексте одной программы, а отображение должно любой контекст интерпретировать правильно, и опять же определить контекст полагается программисту, а не устройству которое будет отображать символ.
Современные программисты также как и учебники программирования, стали забывать что
программист должен контролировать все устройства ввода вывода, а не операционная система. в связи с этим начинающие программисты не понимают почему программа которая написана корректно с точки зрения алгоритмов работает не правильно, то есть не отображает символы так как задумал программист.
Немного практики
В современном мире, почти все кодировки и отображение контролирует операционная система, чаще всего в Windows отображаются кракозябры, а в Linux все хорошо, и новичкам советуют ставить Linux и не «париться», это в корне не верный подход, На самом деле все дело в настройках операционной системе на которой вы работаете. В Linux кодировка и отображение кодировки настроено на стандарт unicode utf-8 или unicode utf-32le (смотря какой конкретный дистрибутив) и оба стандарта совместимы, а в Windows исторически сложилось Legacy разработка, настройка кодировки отображения идет в console cp866(Если вы используете русский диструбутив windows) а winapi использует code pages 1251(На русском дистрибутиве) в связи с этим у нас несколько путей решения:
- Сохранять исходные коды в cp866 чтобы компилятор или интерпретатор «вшивал» код символов для conosle windows по умолчанию.
- Подменять шрифты где символы соответствуют кодировке cp866 то есть символ «А» в шрифте графически был на месте символа который выглядит как не «А». Например в нумерации кодировки для символа «А» cp866 это код 0x80, а для символа windows code pages 1251 0xc0 таким образом именно в шрифте нужно перерисовать символы где должны отображаться буква «А».
- Подменять кодировку программно нужно написать небольшую функцию(процедуру) которая перехватывает весь поток вывода и подменяет символы на ту кодировку которая отображает символы по умолчанию это cp866.
- Самый рациональный и простой метод это переключить операционную систему в нужную вам кодировку, для console windows это будет команда в самой консоле chcp 1251 для кодировки windows code pages 1251, а для unicode utf-8 соответственно chcp 65001 (список всех кодировок windows) для языка C++ можно написать команду после main
system("chcp 1251");
Все эти советы актуальны для любой платформы (переключение кодировки самой консоли читайте в документации операционной системы), есть и более хитрые или изящные способы кодирования символов, но в данной статье-заметке кодировки рассмотрены с точки зрения операционных систем.
комментарии (20)