Closed kraa965 closed 7 months ago
Alt+Shift?
я имею ввиду через print("Привет"), вместо привет, он выдает символы и другие буквы
Ну он и не должен выдавать русские, это ведь клавиатура. Нужно переключить язык и писать английскими, которые соответствуют русским
Ну он и не должен выдавать русские, это ведь клавиатура. Нужно переключить язык и писать английскими, которые соответствуют русским
Получается, надо написать print("Ghbdtn"), переключить клаву и будет все по-русски. А если надо передать текст из веб, ввожу в поле русский текст, а выдаются просто символы, как бы в таком случае?
Надо писать свой парсер, который будет вытаскивать русские буквы из текста, переводить их в англ согласно qwerty раскладке, формировать строку и отправлять в принт. А если текст смешанный русско-англ - переключать язык, выдерживать паузу, но опять же обратной связи по языку нет, можно сбиться
Можно посмотреть как парсит библиотека gyveroled, там все русские буквы обрабатываются
Можно посмотреть как парсит библиотека gyveroled, там все русские буквы обрабатываются
Есть же еще библиотека GParser, она может помочь?
Gparser разбивает текст на куски по заданному символу-разделителю
Gparser разбивает текст на куски по заданному символу-разделителю
Видимо долблюсь в глаза, не нашел в gyverOLED парсер, подскажите где она?
Со строки 275 по 285 https://github.com/GyverLibs/GyverOLED/blob/main/src/GyverOLED.h
И дальше внизу функция getFont разбирает в таблицу
Я могу закодить, но через несколько дней
Я могу закодить, но через несколько дней
буду очень сильно признателен в целом у меня работает вывод русского текста, я объединил библиотеку https://github.com/T-vK/ESP32-BLE-Keyboard и https://github.com/MichaelDworkin/Arduino-USB-Macro-Keyboard-Russian Но проблема в том, если я хочу после текста поставить Enter(Return) объединенная библиотека вместо Enter(Return) выводит "а", хотелось бы доработать таким образом, чтобы она затрагивала только буквенные символы, это можно как-то реализовать?
Вот так можно преобразовать русскую строку в QWERTY
const char _qwerty_ru[] PROGMEM = "F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z~`";
String ru_to_qw(const String& ru) {
String qw;
uint8_t prev = 0;
for (int i = 0; i < ru.length(); i++) {
uint8_t cur = ru[i];
if (cur > 127) {
uint8_t thiscur = cur;
if (cur > 191) cur = 0;
else if (prev == 209 && cur == 145) cur = 193; // ё
else if (prev == 208 && cur == 129) cur = 192; // Ё
prev = thiscur;
}
if (!cur) continue;
if (cur <= 127) {
qw += (char)cur;
continue;
}
else if (cur <= 143) cur -= 80;
else if (cur <= 191) cur -= 144;
else cur -= 128;
qw += (char)pgm_read_byte(&_qwerty_ru[cur]);
}
return qw;
}
void setup() {
Serial.begin(115200);
Serial.println(ru_to_qw("Привет")); // Ghbdtn
}
void loop() {
}
Вот так можно преобразовать русскую строку в QWERTY
const char _qwerty_ru[] PROGMEM = "F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z~`"; String ru_to_qw(const String& ru) { String qw; uint8_t prev = 0; for (int i = 0; i < ru.length(); i++) { uint8_t cur = ru[i]; if (cur > 127) { uint8_t thiscur = cur; if (cur > 191) cur = 0; else if (prev == 209 && cur == 145) cur = 193; // ё else if (prev == 208 && cur == 129) cur = 192; // Ё prev = thiscur; } if (!cur) continue; if (cur <= 127) { qw += (char)cur; continue; } else if (cur <= 143) cur -= 80; else if (cur <= 191) cur -= 144; else cur -= 128; qw += (char)pgm_read_byte(&_qwerty_ru[cur]); } return qw; } void setup() { Serial.begin(115200); Serial.println(ru_to_qw("Привет")); // Ghbdtn } void loop() { }
Спасибо) Вечером попробую
Есть еще такая наработка, чтобы буквы конвертировались, но она у меня не работает Может 9наете в чем проблема?
void Keyboard_println(String text) { delay(200); String latinText = ""; for (int i = 0; i < text.length(); i++) { char cyrillicChar = text.charAt(i); char latinChar; switch (cyrillicChar) { case 'а': latinChar = 'f'; break; case 'б': latinChar = ','; break; // add the rest of the symbols and their correspondences here default: // If the symbol is not found, leave it unchanged. latinChar = cyrillicChar; break; } latinText += latinChar; } blekeyboard.println(latinText); }
она у меня не работает
она и не должна работать. Кириллица занимает больше одного байта, писать 'б'
- уже некорректно, буква потеряна. Компилятор должен был об этом предупредить
Вот так можно преобразовать русскую строку в QWERTY
const char _qwerty_ru[] PROGMEM = "F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z~`"; String ru_to_qw(const String& ru) { String qw; uint8_t prev = 0; for (int i = 0; i < ru.length(); i++) { uint8_t cur = ru[i]; if (cur > 127) { uint8_t thiscur = cur; if (cur > 191) cur = 0; else if (prev == 209 && cur == 145) cur = 193; // ё else if (prev == 208 && cur == 129) cur = 192; // Ё prev = thiscur; } if (!cur) continue; if (cur <= 127) { qw += (char)cur; continue; } else if (cur <= 143) cur -= 80; else if (cur <= 191) cur -= 144; else cur -= 128; qw += (char)pgm_read_byte(&_qwerty_ru[cur]); } return qw; } void setup() { Serial.begin(115200); Serial.println(ru_to_qw("Привет")); // Ghbdtn } void loop() { }
Можно этот код под char* адаптировать?
Естественно
Естественно
Подскажите как?
Ну например так
const char _qwerty_ru[] PROGMEM = "F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z~`";
uint16_t ru_to_qw(const char* ru, char* qw) {
uint16_t len = strlen(ru);
uint16_t idx = 0;
uint8_t prev = 0;
for (int i = 0; i < len; i++) {
uint8_t cur = ru[i];
if (cur > 127) {
uint8_t thiscur = cur;
if (cur > 191) cur = 0;
else if (prev == 209 && cur == 145) cur = 193; // ё
else if (prev == 208 && cur == 129) cur = 192; // Ё
prev = thiscur;
}
if (!cur) continue;
if (cur <= 127) {
qw[idx++] = (char)cur;
continue;
}
else if (cur <= 143) cur -= 80;
else if (cur <= 191) cur -= 144;
else cur -= 128;
qw[idx++] = (char)pgm_read_byte(&_qwerty_ru[cur]);
}
qw[idx] = 0;
return idx;
}
void setup() {
Serial.begin(115200);
char* ru = "Привет";
char qw[strlen(ru)];
ru_to_qw(ru, qw);
Serial.println(qw); // Ghbdtn
}
void loop() {
}
Ну например так
const char _qwerty_ru[] PROGMEM = "F<DULT:PBQRKVYJGHCNEA{WXIO}SM\">Zf,dult;pbqrkvyjghcnea[wxio]sm'.z~`"; uint16_t ru_to_qw(const char* ru, char* qw) { uint16_t len = strlen(ru); uint16_t idx = 0; uint8_t prev = 0; for (int i = 0; i < len; i++) { uint8_t cur = ru[i]; if (cur > 127) { uint8_t thiscur = cur; if (cur > 191) cur = 0; else if (prev == 209 && cur == 145) cur = 193; // ё else if (prev == 208 && cur == 129) cur = 192; // Ё prev = thiscur; } if (!cur) continue; if (cur <= 127) { qw[idx++] = (char)cur; continue; } else if (cur <= 143) cur -= 80; else if (cur <= 191) cur -= 144; else cur -= 128; qw[idx++] = (char)pgm_read_byte(&_qwerty_ru[cur]); } qw[idx] = 0; return idx; } void setup() { Serial.begin(115200); char* ru = "Привет"; char qw[strlen(ru)]; ru_to_qw(ru, qw); Serial.println(qw); // Ghbdtn } void loop() { }
Спасибо)
Привет, подскажите, как можно реализовать вставку русского текста, в видео выводился английский?