При разработке программ для микроконтроллеров, выводящих информацию на ЖКИ, возникает проблема с несовпадением кодировки русских букв в знакогенератореЖКИи кодировки редактора исходных текстов программы (обычно, Win-1251).
Конечно, некоторые ЖКИ имеют знакогенераторы, русские символы в которых совпадают по кодам с кодировкой Windows, но что делать, если ЖКИне такой?Во многихЖКИ русские символы вообще не представляют собой сплошного массива – там присутствуют только символы, начертание которых не совпадаетс английскими, например, «Б», «Ю» и т. п.В этом случае перекодировка –не такой тривиальный процесс.
Известен ряд утилит, которые позволяют перекодировать текст в соответствиис кодировкойЖКИ, но в этом случае понять по исходному тексту программы, что именно будет выведено, практически невозможно: строка «ЖИЗНЬ» может быть заменена на нечтов таком роде «\196\145\201H\234» – узнать первоначальный текст практически невозможно.
Утилита LCD-CONV свободна от многих недостатков известных перекодировщиков и обладает следующими основными характеристиками:
перекодировка происходит непосредственно перед компиляцией, при этом текст программы не меняется
таблица перекодировки может настраиваться пользователем произвольно
программа работает в консольном режиме.
Утилита ищет во входном файле текстовые вхождения в двойных кавычках (как принято задавать строковые константы в Си) и производитих преобразованиев соответствиис заданными правилами.
По умолчанию осуществляется транслитерация русских символов (ж - zh, я – ja и т. д.),но таблицу преобразования русских символов можно сделать произвольной.
Поиск строк ведется с учетом того, что двойные кавычки могут находиться и в комментариях –такие вхождения не преобразуются.
Поиск осуществляется при помощи регулярных выражений, по умолчанию ведется поиск по выражению «.+?», но можно использовать и любое иное выражение. Это позволяет преобразовывать не все строки подряд, а только используемые опреджеленным образом, например:
Если для этого примера запустить LCD-CONVс параметрами по умолчанию, то значения s и s2 будут преобразованы. Однако, если задать регулярное выражение для поиска в таком виде convert\(.+?\) то sне будет преобразована, а s2 – будет.
ВНИМАНИЕ: регулярное выражение задается в командной строке, поэтому не должно содержать символа двойной кавычки ".
Если в таблице преобразования не задано соответствие для какого-либо символа, то этот символ копируется в выходной файл без изменения.
Командная строка для запуска утилиты имеет следующий формат:
В качестве параметров могут использоваться следующие: -q – режим работы без вывода в консоль (тихий режим) -r<expr> – задание регулярного выражения expr для поиска и преобразования строк -h или -? – вывод краткой справке по параметрам командной строки
Исходный файл – это любой текстовый файл в кодировкеWin-1251. Утилита умеет обнаруживать комментарии в стиле Си (т. е./* */ и //) и не обрабатывать вхождения строк внутри комментариев.
Выходной файл может отсутствовать, в этом случае имя выходного файла получается из имени входного путем добавления к его расширению «_c», т. е. из «main.c» получится «main.c_c». Выходной файл, если он существует, перезаписывается без дополнительных предупреждений.
Файл преобразования (так же может отсутствовать) – это обычный текстовый файл, каждая строка которого задает способ преобразования символов в следущем формате: СИМВОЛ=ЗАМЕНА.
СИМВОЛ – это исходный символ кириллицы в кодировкеWin-1251, а ЗАМЕНА – это набор любых символов, которыми заменяется исходный
Например, допустимы следующие строки в таблице преобразований:
А=A Ы=\240 Ю=\0xF0
Разумеется, ЗАМЕНАне должна содержать недопустимых символов для языка Си (и русских букв, само собой).
Я думаю, что будет удобно вставить запуск этой утилиты для нужных файлов проекта в makefile, а компилировать уже те файлы, которые будут получены в итоге.В этом случае исходный текст в вашем редакторе будет содержать русские строки в привычной для вас кодировке Windows, а в скомпилированный файл попадут уже перекодированные строки. Таким образом обеспечивается удобство разработки и нужный результат.