Перекодировка кириллицы на С

Рейтинг: 0Ответов: 1Опубликовано: 19.06.2023

Мне необходимо написать код, перекодирующий написанное из Windows 1251 во внутрненнюю кодировку ЖК-дисплея.

В коде ниже написаны коды заглавных кириллических символов, но мне будет достаточно примера с одним символом. Например, символы "А" и "Б" в кодировке Windows 1251 имеют шестнадцатиричную запись 0xC0 и 0xC1, во внутренней кодировке ЖК-дисплея эти же символы записываются как 0x41 и 0xA0; как будет выглядеть код, перекодирующий строку "АБ" из кодировки Windows 1251 во внутреннюю кодировку ЖК-дисплея? Язык C51. ЖК-дисплей WH1602B-YYH-CTK.

Надо думать это относительно простая задача, но я разбираюсь в программировании так же, как Кличко в шахматах. Прошу вас, помогите, пожалуйста!

Внутренняя кодировка ЖК-дисплея

#include "sdk_base.h"
void main (void)
{
    //Stroka vivodimaya na ZHK displey
    uchar *putstr1 = "Ïðèâåò, Ìèð!Ïðèâåò, Ìèð!Ïðèâåò, Ìèð!"; // Здесь текст в Windows1251 ("Привет, мир!Привет, мир!Привет, мир!")

    int i = 0;

    //Perekodirovka kirillici
    if (putstr1 = "0xC0") { 
        putstr1 = "0x41";   //bukva A
        };
    if (putstr1 = "0xC1") { 
        putstr1 = "0xA0";       //bukva B
        };
    if (putstr1 = "0xC2") { 
        putstr1 = "0x42";       //bukva V
        };
    if (putstr1 = "0xC3") { 
        putstr1 = "0xA1";       //bukva G
        };  
    if (putstr1 = "0xC4") { 
        putstr1 = "0xE0";       //bukva D
        };
    if (putstr1 = "0xC5") { 
        putstr1 = "0x45";       //bukva E
        };
    if (putstr1 = "0xC6") { 
        putstr1 = "0xA3";       //bukva ZH
        };
    if (putstr1 = "0xC7") { 
        putstr1 = "0xA4";       //bukva Z
        };
    if (putstr1 = "0xC8") { 
        putstr1 = "0xA5";       //bukva I
        };
    if (putstr1 = "0xCA") { 
        putstr1 = "0x4B";       //bukva K
        };
    if (putstr1 = "0xCB") { 
        putstr1 = "0xA7";       //bukva L
        };
    if (putstr1 = "0xCC") { 
        putstr1 = "0x4D";       //bukva M
        };
    if (putstr1 = "0xCD") { 
        putstr1 = "0x48";       //bukva N
        };
    if (putstr1 = "0xCE") { 
        putstr1 = "0x4F";       //bukva O
        };
    if (putstr1 = "0xCF") { 
        putstr1 = "0xA8";       //bukva P
        };
    if (putstr1 = "0xD0") { 
        putstr1 = "0x50";       //bukva R
        };
    if (putstr1 = "0xD1") { 
        putstr1 = "0x43";       //bukva S
        };
    if (putstr1 = "0xD2") { 
        putstr1 = "0x54";       //bukva T
        };
    if (putstr1 = "0xD3") { 
        putstr1 = "0xA9";       //bukva U
        };
    if (putstr1 = "0xD4") { 
        putstr1 = "0xAA";       //bukva F
        };
    if (putstr1 = "0xD5") { 
        putstr1 = "0x58";       //bukva H
        };
    if (putstr1 = "0xD6") { 
        putstr1 = "0xE1";       //bukva C
        };
    if (putstr1 = "0xD7") { 
        putstr1 = "0xAB";       //bukva CH
        };
    if (putstr1 = "0xD8") { 
        putstr1 = "0xAC";       //bukva SH
        };
    if (putstr1 = "0xD9") { 
        putstr1 = "0xE2";       //bukva SHA
        };
    if (putstr1 = "0xDA") { 
        putstr1 = "0xAD";       //bukva tverdiy znak
        };
    if (putstr1 = "0xDB") { 
        putstr1 = "0xAE";       //bukva Ib
        };
    if (putstr1 = "0xDC") { 
        putstr1 = "0x62";       //bukva myagkiy znak
        };
    if (putstr1 = "0xDD") { 
        putstr1 = "0xAF";       //bukva AEEEEE
        };
    if (putstr1 = "0xDE") { 
        putstr1 = "0xB0";       //bukva YUUUUU
        };
    if (putstr1 = "0xDF") { 
        putstr1 = "0xB1";       //bukva YUUUUU
        };
    //-----------------Perviy variant-----------------//
    while (putstr1[i] != '\0'){
             lputchar(putstr1[i++],1);
             };
    lputchar(LCD_POS(0x44),0);
    while (putstr1[i] != '\0'){
             lputchar(putstr1[i++],1);
             };

    //-----------------Vtoroy variant-----------------//
    //while (i != 7){
    //           lputchar(putstr1[i++],1);
    //           };
    //lputchar(LCD_POS(0x44),0);
    //while (k != 15){
    //           lputchar(putstr1[i++],1);
    //           };
    while (1);
}

Ответы

▲ 3

В принципе avp всё уже написал. Заводится массив, в котором на месте буквы А стоит новый код, который вам нужен - код символа для ЖК-дисплея, на месте Б - его код и т.д. И потом в цикле проходите по строке и меняете исходный символ на код из таблицы перекодировки.

#include "sdk_base.h"
void main (void)
{
    //Stroka vivodimaya na ZHK displey
    uchar putstr1[100] = "Ïðèâåò, Ìèð!Ïðèâåò, Ìèð!Ïðèâåò, Ìèð!"; // Здесь текст в Windows1251 ("Привет, мир!Привет, мир!Привет, мир!")

// оригинальная таблица символов - для наглядности, заводить не надо
//               ...[256] = {0, ....,  'A',  'Б',  'В',  'Г',
    uchar recode_tab[256] = {0, ...., 0x41, 0xa0, 0x42, 0xa1, 0xe0, 0x45, ...};

    int i = 0;
    while( putstr1[i] ) // пока putstr1[i] != 0
        putstr1[i] = recode_tab[ putstr1[i++] ];

}

Теперь в массиве putstr1[100] будет находиться фраза в кодах ЖК-дисплея. Эти 3 строки заменяют все ваши if().