Форум программистов, компьютерный форум, киберфорум
Arduino
Войти
Регистрация
Восстановить пароль
 
2 / 2 / 0
Регистрация: 05.04.2020
Сообщений: 48
1

Трудности перевода (Русификация библиотеки UTFT)

07.04.2021, 15:57. Просмотров 243. Ответов 1


Обзавелся я на китайском рынке дисплейчиком для ардуино 3.95" с тач падом на борту. (контроллер ST7796). С шутками и прибаутками добавил поддержку данного дисплейчика в библиотеку(правда при выполнении .clrScr() Экран не приятно мерцает, но это мелочи). Показалось мне досадным факт, что имея графический дисплей, я не могу вывести русский текст. Немного покопавшись в интернете я наткнулся на статью следующего содержания: https://xn--90acbu5aj5f.xn--p1ai/?p=2240

Следуя инструкции от туда, я добавил русские символы, и смог их спокойно вывести непосредственно скармливая в print byte c символом. Но это как то не удобно, и удумалось мне написать функцию которая будет преобразовывать русские символы в меня интересующие байты.

С английскими символами всё понятно: 1 символ =1 байт в соответствии ASCII
Но с русскими: 1 символ = 2 байта
Например "A" = 0xD0 , 0x90

Вооружившись этой информацией и не жалея места(если есть идеи по оптимизации, буду рад их услышать) я написал это(в скетче):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
String character_rus[66] =
{
    "А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й",
    "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У",
    "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э",
    "Ю", "Я", "а", "б", "в", "г", "д", "е", "ё", "ж", "з", 
    "и", "й", "к", "л", "м", "н", "о", "п", "р", "с",
    "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы",
    "ь", "э", "ю", "я"
};
 
uint8_t code_byte_lcd[66] =
{   0x41, 0x80, 0x42, 0x81, 0x82, 0x45, 0x83, 0x84, 0x85, 0x86, 0x87,
    0x4B, 0x88, 0x4D, 0x48, 0x4F, 0x89, 0x50, 0x43, 0x54, 0x8A,
    0x8B, 0x58, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93,
    0x94, 0x95, 0x61, 0x96, 0x97, 0x98, 0x99, 0x65, 0x9A,  0x9B, 0x9C,
    0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0x6F, 0xA3, 0x70, 0x63,
    0xA4, 0x79, 0xA5, 0x78, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB,
    0xAC, 0xAD, 0xAE, 0xAF
     
};
 
 
void printrus(char* st, int x, int y, int deg=0)
{
 
  String newst="";
  bool rus = false;
  String c = "";
  int stl = strlen(st);
  
  for (int i = 0; i < stl; i++) 
  {
    if (rus)
    {
      rus = false;
      c = "";
      continue;
 
      }
    
    if ((byte)st[i] < 0x7F) 
    {
      newst += st[i];
      continue;
    }
    
    c = c + (char)(st[i]) + (char)(st[i + 1]);
    rus = true;
    for (int j = 0; j < 66; j++)
    {
      if (c == character_rus[j]) 
      {
        newst += (char)code_byte_lcd[j];
 
        continue;
      }
    }
    //newst += st[i];
  }
  myGLCD.print(newst, x, y, deg);
 
}
 
void printrus(String st, int x, int y, int deg=0)
{
  char buf[st.length() + 1];
 
  st.toCharArray(buf, st.length() + 1);
  printrus(buf, x, y, deg);
}
Да, да. Я программист "от бога", но как умею. Как писал выше рад любым идеям

И как бы оно не выглядело оно работает

Но это в скетче, а я то в библиотеку хотел добавить. Добавляем в UTFT.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
String character_rus[66] =
{
    "А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й",
    "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У",
    "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э",
    "Ю", "Я", "а", "б", "в", "г", "д", "е", "ё", "ж", "з", 
    "и", "й", "к", "л", "м", "н", "о", "п", "р", "с",
    "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы",
    "ь", "э", "ю", "я"
};
 
uint8_t code_byte_lcd[66] =
{   0x41, 0x80, 0x42, 0x81, 0x82, 0x45, 0x83, 0x84, 0x85, 0x86, 0x87,
    0x4B, 0x88, 0x4D, 0x48, 0x4F, 0x89, 0x50, 0x43, 0x54, 0x8A,
    0x8B, 0x58, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x91, 0x92, 0x93,
    0x94, 0x95, 0x61, 0x96, 0x97, 0x98, 0x99, 0x65, 0x9A,  0x9B, 0x9C,
    0x9D, 0x9E, 0x9F, 0xA0, 0xA1, 0xA2, 0x6F, 0xA3, 0x70, 0x63,
    0xA4, 0x79, 0xA5, 0x78, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB,
    0xAC, 0xAD, 0xAE, 0xAF
     
};
 
//------------------------------------
 
void UTFT::printrus(char* st, int x, int y, int deg)
{
 
    String newst="";
    bool rus = false;
    String c = "";
    int stl = strlen(st);
    
    for (int i = 0; i < stl; i++) 
    {
        if (rus)
        {
            rus = false;
            c = "";
            continue;
 
        }
        
        if ((byte)st[i] < 0x7F) 
        {
            newst += st[i];
            continue;
        }
        
        c = c + (char)(st[i]) + (char)(st[i + 1]);
        rus = true;
        for (int j = 0; j < 66; j++)
        {
            if (c == character_rus[j]) 
            {
                newst += (char)code_byte_lcd[j];
 
                continue;
            }
        }
        //newst += st[i];
    }
    print(newst, x, y, deg);
 
}
 
void UTFT::printrus(String st, int x, int y, int deg)
{
    char buf[st.length() + 1];
 
    st.toCharArray(buf, st.length() + 1);
    printrus(buf, x, y, deg);
}
В UTFT.h:
C++
1
2
void    printrus(char* st, int x, int y, int deg=0);
void    printrus(String st, int x, int y, int deg = 0);
В скетч:
C++
1
2
extern String character_rus[];
extern uint8_t code_byte_lcd[];
Результат: Игнор русских символов
Что же пошло не так?
Эксперимент:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <UTFT.h>
 
// Declare which fonts we will be using
extern uint8_t SmallFont[];
extern uint8_t code_byte_lcd[];
 
extern String character_rus[];
 
String character_rus_[66] =
{
  "А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й",
  "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У",
  "Ф", "Х", "Ц", "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э",
  "Ю", "Я", "а", "б", "в", "г", "д", "е", "ё", "ж", "з",
  "и", "й", "к", "л", "м", "н", "о", "п", "р", "с",
  "т", "у", "ф", "х", "ц", "ч", "ш", "щ", "ъ", "ы",
  "ь", "э", "ю", "я"
};
 
 
 
 
UTFT myGLCD(ST7796, 38, 39, 40, 41, 42);
 
void setup()
{
  randomSeed(analogRead(0));
  Serial.begin(9600);
  //Serial.println(SmallFont.length);
  for (byte i = 0; i < 66; i++) {
    String c = character_rus_[i];
 
    Serial.println(c);
    Serial.print((byte)c[0]);
    Serial.print("\t");
    Serial.println((byte)c[1]);
 
    Serial.println();
    c = character_rus[i];
    Serial.println(c);
    Serial.print((byte)c[0]);
    Serial.print("\t");
    Serial.println((byte)c[1]);
    Serial.println();
  }
  // Setup the LCD
  myGLCD.InitLCD();
 
  myGLCD.setFont(SmallFont);
}
Результат прикрепил. (наверное внизу будет)

Почему то "А" из массива из библиотеки кодируется уже одним байтом 0хC0
И Serial не знает что с ним делать. Вопрос: где косяк с типом данных(массива)?
0
Миниатюры
Трудности перевода (Русификация библиотеки UTFT)  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.04.2021, 15:57
Ответы с готовыми решениями:

Переделка библиотеки UTFT arduino под чистый Си AvrStudio
Имеется дисплей TFT 320х240 на контроллере ssd1289 попробывал найти библиотеку в сети что то...

Трудности перевода
Здравствуйте коллеги! Сразу к делу... я в английском не силен, но нужно для програмного продукта...

Трудности перевода
Данная игра получилась и одной тематической темы Получилась, в общем, случайно. В этом есть моя...

Трудности машинного перевода
Если пометить метод с модификатором Async, можно использовать оператор Подождите в методе. Выписка...

1
Модератор
Эксперт по электронике
8360 / 6206 / 834
Регистрация: 14.02.2011
Сообщений: 21,569
07.04.2021, 21:45 2
Цитата Сообщение от Muramur2000 Посмотреть сообщение
Но с русскими: 1 символ = 2 байта
Например "A" = 0xD0 , 0x90
не факт, зависит от кодировки например кодировка виндос Windows-1251 https://ru.wikipedia.org/wiki/Windows-1251
и их еще до проха, не все стыкуются между собой
вот для этого и придумали UniCode, самая распространённая 2хбайтная но есть варианты
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.04.2021, 21:45

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Трудности перевода скрипта from JS to C#
Люди добрые! Есть скрипт на JS,мне он нужен в C# ну очень очень) помогите преобразовать его в C#....

Трудности перевода Pascal -> Delphi
Добрый день форумчане! Я столкнулся с проблемой перевода из паскаля в делфи программы-тестера,...

Трудности перевода. Service provider
Здравия желаю! Собственно, не очень понятно выражение, используемое в описаниях к разным функциям...

Трудности перевода с Pascal на Basic
Помогите, пожалуйста. Ссылка вырезана. Перепечатывай код сюда Добавлено через 34 минуты Нужно...

Как записать текст в textBox (трудности перевода)?
Как записать текст в textBox (трудности перевода)? Уважаемые форумчане, при работе с Делфи в...

Терминология и трудности перевода при работе в SAP
Здравствуйте! Я провожу небольшой опрос на тему &quot;Сложности в использовании программного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.