Конвертер русских строк для ЖКИ
Автор ARV   
16.11.2009 г.

При разработке программ для микроконтроллеров, выводящих информацию на ЖКИ, возникает проблема с несовпадением кодировки русских букв в знакогенераторе ЖКИ и кодировки редактора исходных текстов программы (обычно, Win-1251).

Конечно, некоторые ЖКИ имеют знакогенераторы, русские символы в которых совпадают по кодам с кодировкой Windows, но что делать, если ЖКИ не такой? Во многих ЖКИ русские символы вообще не представляют собой сплошного массива - там присутствуют только символы, начертание которых не совпадает с английскими, например, "Б", "Ю" и т.п. В этом случае перекодировка - не такой тривиальный процесс.

 

Известен ряд утилит, которые позволяют перекодировать текст в соответствии с кодировкой ЖКИ, но в этом случае понять по исходному тексту программы, что именно будет выведено, практически невозможно: строка "ЖИЗНЬ" может быть заменена на нечто в таком роде "\196\145\201H\234" - узнать первоначальный текст практически невозможно.

Утилита LCD-CONV свободна от многих недостатков известных перекодировщиков и обладает следующими основными характеристиками:

  • перекодировка происходит непосредственно перед компиляцией, при этом текст программы не меняется
  • таблица перекодировки может настраиваться пользователем произвольно
  • программа работает в консольном режиме.

Утилита ищет во входном файле текстовые вхождения в двойных кавычках (как принято задавать строковые константы в Си) и производит их преобразование в соответствии с заданными правилами.

По умолчанию осуществляется транслитерация русских символов (ж - zh, я - ja и т.д.), но таблицу преобразования русских символов можно сделать произвольной.

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

Поиск осуществляется при помощи регулярных выражений, по умолчанию ведется поиск по выражению ".+?", но можно использовать и любое иное выражение. Это позволяет преобразовывать не все строки подряд, а только используемые опреджеленным образом, например:

#define convert(x) x
char s[] = "проверка";
char s2[] = convert("проверка");

Если для этого примера запустить LCD-CONV с параметрами по умолчанию, то значения s и s2 будут преобразованы. Однако, если задать регулярное выражение для поиска в таком виде convert\(.+?\) то s не будет преобразована, а s2 - будет.

ВНИМАНИЕ: регулярное выражение задается в командной строке, поэтому не должно содержать символа двойной кавычки ".

Если в таблице преобразования не задано соответствие для какого-либо символа, то этот символ копируется в выходной файл без изменения.

Командная строка для запуска утилиты имеет следующий формат:

LCD-CONV [параметры] -s<исходный файл> [-o<выходной файл>] [-t<файл преобразования>]

В качестве параметров могут использоваться следующие:
  -q         - режим работы без вывода в консоль (тихий режим)
  -r<expr>   - задание регулярного выражения expr для поиска и преобразования строк
  -h или -?  - вывод краткой справке по параметрам командной строки

Исходный файл - это любой текстовый файл в кодировке Win-1251. Утилита умеет обнаруживать комментарии в стиле Си (т.е. /* */ и //) и не обрабатывать вхождения строк внутри комментариев.

Выходной файл может отсутствовать, в этом случае имя выходного файла получается из имени входного путем добавления к его расширению "_c", т.е. из "main.c" получится "main.c_c". Выходной файл, если он существует, перезаписывается без дополнительных предупреждений.

Файл преобразования (так же может отсутствовать) - это обычный текстовый файл, каждая строка которого задает способ преобразования символов в следущем формате: СИМВОЛ=ЗАМЕНА.

СИМВОЛ - это исходный символ кириллицы в кодировке Win-1251, а ЗАМЕНА - это набор любых символов, которыми заменяется исходный

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

А=A
Ы=\240
Ю=\0xF0

Разумеется, ЗАМЕНА не должна содержать недопустимых символов для языка Си (и русских букв, само собой).

 

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

Скачать утилиту, как обычно, можно из файлового архива.
Обсудить материал на форуме. (0 сообщений)


Добавить в любимые (0) | Просмотров: 24825

  Коментарии (5)
 1 Написал(а) Настя, в 20:08 11.05.2010
> Известен ряд утилит 
Сошлитесь на них. 
 
> понять по исходному тексту... практически невозможно 
Комментируйте исходник. 
 
> char s[] = «проверка»; 
чтобы это сработало нужен lcd-conv 
... не кошерно 
 
а не проще вместо «\196\145\201H\234» или «проверка» 
сразу написать «ѕpoіepєa»
 2 Написал(а) Настя, в 20:09 11.05.2010
а можно весь текст выше и так написать ))) 
 
> Ґ·іecїeЅ pЗг yїё»ёї 
CoБ»ёїecД Ѕa Ѕёx. 
 
> ѕoЅЗїД ѕo ёcxoгЅoјy їeєcїy... ѕpaєїёАecєё Ѕeіo·јo¶Ѕo 
KoјјeЅїёpy№їe ёcxoгЅёє. 
 
> char s[] = ѕpoіepєa; 
АїoІГ Еїo cpaІoїa»o Ѕy¶eЅ lcd-conv 
... Ѕe єoБepЅo 
 
a Ѕe ѕpoжe іјecїo 196145201H234 ё»ё ѕpoіepєa 
cpa·y ЅaѕёcaїД poepa
 3 Написал(а) ARV, в 07:21 13.05.2010
ценю ваш юмор. ха-ха.
 4 Написал(а) Александр, в 14:46 09.08.2012
A еще вариант чистА кирилица.... не знаю автора , но я ему благодарен OЧЕНЬ 
const unsigned char kirilTable[64]= { 
0x41, 0xA0, 0x42, 0xA1, 0xE0, 0x45, 0xA3, 0xA4, 0xA5, 0xA6, 0x4B, 0xA7, 0x4D, 0x48, 0x4F, 0xA8, 
0x50, 0x43, 0x54, 0xA9, 0xAA, 0x58, 0xE1, 0xAB, 0xAC, 0xE2, 0xAD, 0xAE, 0xAD, 0xAF, 0xB0, 0xB1, 
0x61, 0xB2, 0xB3, 0xB4, 0xE3, 0x65, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xBB, 0xBC, 0xBD, 0x6F, 0xBE, 
0x70, 0x63, 0xBF, 0x79, 0xE4, 0x78, 0xE5, 0xC0, 0xC1, 0xE6, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7}; 
void dd_lcd(flash unsigned char *mas, unsigned char len ) //В функцию 
//передаём параметры: mas - текст который выводим, len - его длина 
{ unsigned char i,P; 
 
for (i=0;i 0x7F) P=kirilTable[mas[i]-0xC0]; 
lcd_putchar(P); 


////////// 
а вот так вывод текста 
lcd_gotoxy(1,2); 
dd_lcd("ПРОВЕРКА ЗАВЕРШЕНА",18);
 5 Написал(а) Александр, в 14:48 09.08.2012
сорри... тут цифра 18 длинна выводимой строки земенил смайлик 
lcd_gotoxy(1,2); 
dd_lcd("ПРОВЕРКА ЗАВЕРШЕНА", 1 8 );

Только зарегистрированные пользователи могут оставлять коментарии.
Пожалуйста зарегистрируйтесь или войдите в ваш аккаунт.