Перекодировка кириллицы на С
Мне необходимо написать код, перекодирующий написанное из 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);
}
Ответы (1 шт):
В принципе 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().
