Помогите создать универсальный инструмент для публикации русских букв с английскими

люди добрые, и не очень, подмогните рукопопу кто чем может, (или сделайте за меня) не печатается 2 символа Ёё, и не печатается русский текст с английским, надо не только для дисплея, но и для вебсервера… если получится сможете пользоваться сами

а так же возможно плохо печатается русская буква у…

  0x77, 0x08, 0x7F, 0x08, 0x77,  // Ё 0xF0
  0x2C, 0x50, 0x7C, 0x50, 0x2C,  // ё 0xF1
String yoTest = utf8_to_cp866_complete("Ёлка ёжик ЁЖИК");
drawMixedText(10, 30, yoTest.c_str(), TFT_RED);

каюсь что лень, и совершенно нет времени сидеть вникать)))
если скинете ссылку на что то готовое, я подозреваю что она не будет работать с текстом отправленным через сайт… но это не точно

#include <TFT_eSPI.h>
#include <pgmspace.h>

// ==================== СИСТЕМНЫЙ ШРИФТ SystemRus5x7 ====================
const uint8_t SystemRus5x7Bitmaps[] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00,// (space) 0x20
  0x00, 0x00, 0x5F, 0x00, 0x00,// ! 0x21
  0x00, 0x07, 0x00, 0x07, 0x00,// " 0x22
  0x14, 0x7F, 0x14, 0x7F, 0x14,// # 0x23
  0x24, 0x2A, 0x7F, 0x2A, 0x12,// $ 0x24
  0x23, 0x13, 0x08, 0x64, 0x62,// % 0x25
  0x36, 0x49, 0x55, 0x22, 0x50,// & 0x26
  0x00, 0x05, 0x03, 0x00, 0x00,// ' 0x27
  0x00, 0x1C, 0x22, 0x41, 0x00,// ( 0x28
  0x00, 0x41, 0x22, 0x1C, 0x00,// ) 0x29
  0x08, 0x2A, 0x1C, 0x2A, 0x08,// * 0x2A
  0x08, 0x08, 0x3E, 0x08, 0x08,// + 0x2B
  0x00, 0x50, 0x30, 0x00, 0x00,// , 0x2C
  0x08, 0x08, 0x08, 0x08, 0x08,// - 0x2D
  0x00, 0x60, 0x60, 0x00, 0x00,// . 0x2E
  0x20, 0x10, 0x08, 0x04, 0x02,// / 0x2F
  0x3E, 0x51, 0x49, 0x45, 0x3E,// 0 0x30
  0x00, 0x42, 0x7F, 0x40, 0x00,// 1 0x31
  0x42, 0x61, 0x51, 0x49, 0x46,// 2 0x32
  0x21, 0x41, 0x45, 0x4B, 0x31,// 3 0x33
  0x18, 0x14, 0x12, 0x7F, 0x10,// 4 0x34
  0x27, 0x45, 0x45, 0x45, 0x39,// 5 0x35
  0x3C, 0x4A, 0x49, 0x49, 0x30,// 6 0x36
  0x01, 0x71, 0x09, 0x05, 0x03,// 7 0x37
  0x36, 0x49, 0x49, 0x49, 0x36,// 8 0x38
  0x06, 0x49, 0x49, 0x29, 0x1E,// 9 0x39
  0x00, 0x36, 0x36, 0x00, 0x00,// : 0x3A
  0x00, 0x56, 0x36, 0x00, 0x00,// ; 0x3B
  0x00, 0x08, 0x14, 0x22, 0x41,// < 0x3C
  0x14, 0x14, 0x14, 0x14, 0x14,// = 0x3D
  0x41, 0x22, 0x14, 0x08, 0x00,// > 0x3E
  0x02, 0x01, 0x51, 0x09, 0x06,// ? 0x3F
  0x32, 0x49, 0x79, 0x41, 0x3E,// @ 0x40
  0x7E, 0x11, 0x11, 0x11, 0x7E,// A 0x41
  0x7F, 0x49, 0x49, 0x49, 0x36,// B 0x42
  0x3E, 0x41, 0x41, 0x41, 0x22,// C 0x43
  0x7F, 0x41, 0x41, 0x22, 0x1C,// D 0x44
  0x7F, 0x49, 0x49, 0x49, 0x41,// E 0x45
  0x7F, 0x09, 0x09, 0x01, 0x01,// F 0x46
  0x3E, 0x41, 0x41, 0x51, 0x32,// G 0x47
  0x7F, 0x08, 0x08, 0x08, 0x7F,// H 0x48
  0x00, 0x41, 0x7F, 0x41, 0x00,// I 0x49
  0x20, 0x40, 0x41, 0x3F, 0x01,// J 0x4A
  0x7F, 0x08, 0x14, 0x22, 0x41,// K 0x4B
  0x7F, 0x40, 0x40, 0x40, 0x40,// L 0x4C
  0x7F, 0x02, 0x04, 0x02, 0x7F,// M 0x4D
  0x7F, 0x04, 0x08, 0x10, 0x7F,// N 0x4E
  0x3E, 0x41, 0x41, 0x41, 0x3E,// O 0x4F
  0x7F, 0x09, 0x09, 0x09, 0x06,// P 0x50
  0x3E, 0x41, 0x51, 0x21, 0x5E,// Q 0x51
  0x7F, 0x09, 0x19, 0x29, 0x46,// R 0x52
  0x46, 0x49, 0x49, 0x49, 0x31,// S 0x53
  0x01, 0x01, 0x7F, 0x01, 0x01,// T 0x54
  0x3F, 0x40, 0x40, 0x40, 0x3F,// U 0x55
  0x1F, 0x20, 0x40, 0x20, 0x1F,// V 0x56
  0x7F, 0x20, 0x18, 0x20, 0x7F,// W 0x57
  0x63, 0x14, 0x08, 0x14, 0x63,// X 0x58
  0x03, 0x04, 0x78, 0x04, 0x03,// Y 0x59
  0x61, 0x51, 0x49, 0x45, 0x43,// Z 0x5A
  0x00, 0x00, 0x7F, 0x41, 0x41,// [ 0x5B
  0x02, 0x04, 0x08, 0x10, 0x20,// "\" 0x5C
  0x41, 0x41, 0x7F, 0x00, 0x00,// ] 0x5D
  0x04, 0x02, 0x01, 0x02, 0x04,// ^ 0x5E
  0x40, 0x40, 0x40, 0x40, 0x40,// _ 0x5F
  0x00, 0x01, 0x02, 0x04, 0x00,// ` 0x60
  0x20, 0x54, 0x54, 0x54, 0x78,// a 0x61
  0x7F, 0x48, 0x44, 0x44, 0x38,// b 0x62
  0x38, 0x44, 0x44, 0x44, 0x20,// c 0x63
  0x38, 0x44, 0x44, 0x48, 0x7F,// d 0x64
  0x38, 0x54, 0x54, 0x54, 0x18,// e 0x65
  0x08, 0x7E, 0x09, 0x01, 0x02,// f 0x66
  0x08, 0x14, 0x54, 0x54, 0x3C,// g 0x67
  0x7F, 0x08, 0x04, 0x04, 0x78,// h 0x68
  0x00, 0x44, 0x7D, 0x40, 0x00,// i 0x69
  0x20, 0x40, 0x44, 0x3D, 0x00,// j 0x6A
  0x00, 0x7F, 0x10, 0x28, 0x44,// k 0x6B
  0x00, 0x41, 0x7F, 0x40, 0x00,// l 0x6C
  0x7C, 0x04, 0x18, 0x04, 0x78,// m 0x6D
  0x7C, 0x08, 0x04, 0x04, 0x78,// n 0x6E
  0x38, 0x44, 0x44, 0x44, 0x38,// o 0x6F
  0x7C, 0x14, 0x14, 0x14, 0x08,// p 0x70
  0x08, 0x14, 0x14, 0x18, 0x7C,// q 0x71
  0x7C, 0x08, 0x04, 0x04, 0x08,// r 0x72
  0x48, 0x54, 0x54, 0x54, 0x20,// s 0x73
  0x04, 0x3F, 0x44, 0x40, 0x20,// t 0x74
  0x3C, 0x40, 0x40, 0x20, 0x7C,// u 0x75
  0x1C, 0x20, 0x40, 0x20, 0x1C,// v 0x76
  0x3C, 0x40, 0x30, 0x40, 0x3C,// w 0x77
  0x44, 0x28, 0x10, 0x28, 0x44,// x 0x78
  0x0C, 0x50, 0x50, 0x50, 0x3C,// y 0x79
  0x44, 0x64, 0x54, 0x4C, 0x44,// z 0x7A
  0x00, 0x08, 0x36, 0x41, 0x00,// { 0x7B
  0x00, 0x00, 0x7F, 0x00, 0x00,// | 0x7C
  0x00, 0x41, 0x36, 0x08, 0x00,// } 0x7D
  0x08, 0x08, 0x2A, 0x1C, 0x08,// -> 0x7E
  0x08, 0x1C, 0x2A, 0x08, 0x08, // <- 0x7F
  // Русские буквы (CP866 кодировка)
  0x7C, 0x14, 0x14, 0x14, 0x08,// p 0x80
  0x38, 0x44, 0x44, 0x44, 0x20,// c 0x81
  0x04, 0x04, 0x7C, 0x04, 0x04,// т 0x82
  0x0C, 0x50, 0x50, 0x50, 0x3C,// у 0x83
  0x30, 0x48, 0xFC, 0x48, 0x30,// ф 0x84
  0x44, 0x28, 0x10, 0x28, 0x44,// x 0x85
  0x7C, 0x40, 0x40, 0x40, 0xFC,// ц 0x86
  0x0C, 0x10, 0x10, 0x10, 0x7C,// ч 0x87
  0x7C, 0x40, 0x7C, 0x40, 0x7C,// ш 0x88
  0x7C, 0x40, 0x7C, 0x40, 0xFC,// щ 0x89
  0x04, 0x7C, 0x50, 0x50, 0x20,// ъ 0x8A
  0x7C, 0x50, 0x50, 0x20, 0x7C,// ы 0x8B
  0x7C, 0x50, 0x50, 0x20, 0x00,// ь 0x8C
  0x28, 0x44, 0x54, 0x54, 0x38,// э 0x8D
  0x7C, 0x10, 0x38, 0x44, 0x38,// ю 0x8E
  0x08, 0x54, 0x34, 0x14, 0x7C,// я 0x8F
  // Заглавные русские буквы
  0x7E, 0x11, 0x11, 0x11, 0x7E,// A 0x90
  0x7F, 0x49, 0x49, 0x49, 0x33,// Б 0x91
  0x7F, 0x49, 0x49, 0x49, 0x36,// В 0x92
  0x7F, 0x01, 0x01, 0x01, 0x03,// Г 0x93
  0xE0, 0x51, 0x4F, 0x41, 0xFF,// Д 0x94
  0x7F, 0x49, 0x49, 0x49, 0x41,// E 0x95
  0x77, 0x08, 0x7F, 0x08, 0x77,// Ж 0x96
  0x41, 0x49, 0x49, 0x49, 0x36,// З 0x97
  0x7F, 0x10, 0x08, 0x04, 0x7F,// И 0x98
  0x7C, 0x21, 0x12, 0x09, 0x7C,// Й 0x99
  0x7F, 0x08, 0x14, 0x22, 0x41,// K 0x9A
  0x20, 0x41, 0x3F, 0x01, 0x7F,// Л 0x9B
  0x7F, 0x02, 0x0C, 0x02, 0x7F,// M 0x9C
  0x7F, 0x08, 0x08, 0x08, 0x7F,// H 0x9D
  0x3E, 0x41, 0x41, 0x41, 0x3E,// O 0x9E
  0x7F, 0x01, 0x01, 0x01, 0x7F,// П 0x9F
  0x7F, 0x09, 0x09, 0x09, 0x06,// P 0xA0
  0x3E, 0x41, 0x41, 0x41, 0x22,// C 0xA1
  0x01, 0x01, 0x7F, 0x01, 0x01,// T 0xA2
  0x47, 0x28, 0x10, 0x08, 0x07,// У 0xA3
  0x1C, 0x22, 0x7F, 0x22, 0x1C,// Ф 0xA4
  0x63, 0x14, 0x08, 0x14, 0x63,// X 0xA5
  0x7F, 0x40, 0x40, 0x40, 0xFF,// Ц 0xA6
  0x07, 0x08, 0x08, 0x08, 0x7F,// Ч 0xA7
  0x7F, 0x40, 0x7F, 0x40, 0x7F,// Ш 0xA8
  0x7F, 0x40, 0x7F, 0x40, 0xFF,// Щ 0xA9
  0x01, 0x7F, 0x48, 0x48, 0x30,// Ъ 0xAA
  0x7F, 0x48, 0x30, 0x00, 0x7F,// Ы 0xAB
  0x00, 0x7F, 0x48, 0x48, 0x30,// Э 0xAC
  0x22, 0x41, 0x49, 0x49, 0x3E,// Ь 0xAD
  0x7F, 0x08, 0x3E, 0x41, 0x3E,// Ю 0xAE
  0x46, 0x29, 0x19, 0x09, 0x7F,// Я 0xAF
  // Строчные русские буквы
  0x20, 0x54, 0x54, 0x54, 0x78,// a 0xB0
  0x3C, 0x4A, 0x4A, 0x49, 0x31,// б 0xB1
  0x7C, 0x54, 0x54, 0x28, 0x00,// в 0xB2
  0x7C, 0x04, 0x04, 0x04, 0x0C,// г 0xB3
  0xE0, 0x54, 0x4C, 0x44, 0xFC,// д 0xB4
  0x38, 0x54, 0x54, 0x54, 0x18,// e 0xB5
  0x6C, 0x10, 0x7C, 0x10, 0x6C,// ж 0xB6
  0x44, 0x44, 0x54, 0x54, 0x28,// з 0xB7
  0x7C, 0x20, 0x10, 0x08, 0x7C,// и 0xB8
  0x7C, 0x41, 0x22, 0x11, 0x7C,// й 0xB9
  0x7C, 0x10, 0x28, 0x44, 0x00,// к 0xBA
  0x20, 0x44, 0x3C, 0x04, 0x7C,// л 0xBB
  0x7C, 0x08, 0x10, 0x08, 0x7C,// м 0xBC
  0x7C, 0x10, 0x10, 0x10, 0x7C,// н 0xBD
  0x38, 0x44, 0x44, 0x44, 0x38,// o 0xBE
  0x7C, 0x04, 0x04, 0x04, 0x7C, // п 0xBF
  0x77, 0x08, 0x7F, 0x08, 0x77,  // Ё 0xF0
  0x2C, 0x50, 0x7C, 0x50, 0x2C,  // ё 0xF1
};



// Упрощенная структура для bitmap шрифта
typedef struct {
const uint8_t *bitmap;
uint16_t first;
uint16_t last;
uint8_t  width;
uint8_t  height;
} RusFont;

const RusFont SystemRus5x7Font = {
SystemRus5x7Bitmaps,
0x20,   // first
0xF1,   // last
5,      // width
7       // height
};

// ==================== ОСНОВНОЙ КОД ====================
TFT_eSPI tft = TFT_eSPI();

// Исправленная функция для вывода символов русского шрифта
void drawRussianChar(int x, int y, uint8_t char_code, uint16_t color = TFT_WHITE) {
// Проверяем, находится ли символ в диапазоне нашего шрифта
if (char_code < SystemRus5x7Font.first || char_code > SystemRus5x7Font.last) {
// Если символ не в диапазоне, используем стандартный шрифт
tft.setCursor(x, y);
tft.setTextColor(color);
tft.print((char)char_code);
return;
}
// Вычисляем индекс в массиве bitmap
uint16_t index = (char_code - SystemRus5x7Font.first) * SystemRus5x7Font.width;
// Рисуем каждый пиксель символа
for (uint8_t col = 0; col < SystemRus5x7Font.width; col++) {
uint8_t line = pgm_read_byte(&SystemRus5x7Font.bitmap[index + col]);
for (uint8_t row = 0; row < SystemRus5x7Font.height; row++) {
if (line & 0x01) {
tft.drawPixel(x + col, y + row, color);
}
line >>= 1;
}
}
}

// Исправленная функция для вывода смешанного текста
void drawMixedText(int x, int y, const char* text, uint16_t color = TFT_WHITE) {
int cursor_x = x;
int cursor_y = y;
for (int i = 0; text[i] != '\0'; i++) {
if (text[i] == '\n') {
cursor_y += SystemRus5x7Font.height + 2;
cursor_x = x;
continue;
} 
// Проверка на выход за границы экрана
if (cursor_x + SystemRus5x7Font.width > tft.width()) {
cursor_x = x;
cursor_y += SystemRus5x7Font.height + 2;
} 
// Для ASCII символов используем стандартный шрифт
if ((unsigned char)text[i] < 0x80) {
tft.setCursor(cursor_x, cursor_y);
tft.setTextColor(color);
tft.print(text[i]);
cursor_x += 6; // Ширина стандартного шрифта
} else {
// Для русских символов используем наш шрифт
drawRussianChar(cursor_x, cursor_y, (uint8_t)text[i], color);
cursor_x += SystemRus5x7Font.width + 1;
}
}
}

// Улучшенная конвертация UTF-8 → CP866
String utf8_to_cp866_complete(const String &utf8_str) {
String result = "";
int i = 0;
while (i < utf8_str.length()) {
byte c = utf8_str[i];
// Обработка русских букв (UTF-8 двухбайтовые последовательности)
if (c == 0xD0) { // Первый байт русских букв
if (i + 1 < utf8_str.length()) {
byte c2 = utf8_str[i + 1];
// Заглавные русские буквы А-Я (кроме Ё)
if (c2 >= 0x90 && c2 <= 0xBF) {
result += (char)(0x80 + (c2 - 0x90)); // CP866: 0x80-0xAF
i++;
}
// Буква Ё
else if (c2 == 0x81) {
result += (char)0xF0; // Ё в CP866
i++;
}
else { result += (char)c; // Неизвестный символ
}
}
}
else if (c == 0xD1) { // Второй байт русских букв
if (i + 1 < utf8_str.length()) {
byte c2 = utf8_str[i + 1];
// Строчные русские буквы а-я (кроме ё)
if (c2 >= 0x80 && c2 <= 0x8F) {
result += (char)(0xA0 + (c2 - 0x80)); // CP866: 0xA0-0xAF
i++;
}
// Буква ё
else if (c2 == 0x91) {
result += (char)0xF1; // ё в CP866
i++;
} else { result += (char)c; // Неизвестный символ
}
}
}
// Все остальные символы (ASCII)
else { result += (char)c; }
i++;
}
return result;
}

void setup() {
Serial.begin(115200);
pinMode(TFT_BL, OUTPUT); 
digitalWrite(TFT_BL, HIGH);
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextSize(1);
Serial.println("System ready!");
}

void loop() {
// Тест 1: Русские буквы
tft.fillScreen(TFT_BLACK);
String uppercase = utf8_to_cp866_complete("АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ");
drawMixedText(0, 10, uppercase.c_str(), TFT_GREEN);
String lowercase = utf8_to_cp866_complete("абвгдеёжзийклмнопрстуфхцчшщъыьэюя");
drawMixedText(0, 30, lowercase.c_str(), TFT_YELLOW); 
delay(3000); 
// Тест 2: Смешанный текст
tft.fillScreen(TFT_BLACK);
String mixed = utf8_to_cp866_complete("Привет Hello Ёё Test 123");
drawMixedText(10, 30, mixed.c_str(), TFT_CYAN);
delay(3000);
// Тест 3: Английские символы
tft.fillScreen(TFT_BLACK);
String english = "ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789 !@#$%^&*()";
drawMixedText(10, 30, english.c_str(), TFT_MAGENTA);
delay(3000);
// Тест 4: Ё и ё отдельно
tft.fillScreen(TFT_BLACK);
String yoTest = utf8_to_cp866_complete("Ёлка ёжик ЁЖИК");
drawMixedText(10, 30, yoTest.c_str(), TFT_RED);
delay(3000);
}

В составе примера есть шрифт 5х7 в кодировке Win-1251. Функция перекодировки в общем виде выглядит так

String utf8_to_win1251(String source)
{
  int i;
  String target;
  unsigned char n;
  char m[2] = {'\0', '\0'};

  i = 0;

  while ((uint8_t)source[i] != 0)
  {
    n = (uint8_t)source[i];
    i++;

    if (n >= 0xC0)
    {
      switch (n)
      {
      case 0xD0:
      {
        n = (uint8_t)source[i];
        i++;
        if (n == 0x81)
        {
          n = 0xA8;
          break;
        }
        if (n >= 0x90 && n <= 0xBF)
          n += 0x30;
        break;
      }
      case 0xD1:
      {
        n = (uint8_t)source[i];
        i++;
        if (n == 0x91)
        {
          n = 0xB8;
          break;
        }
        if (n >= 0x80 && n <= 0x8F)
          n += 0x70;
        break;
      }
      }
    }
    m[0] = n;
    target = target + String(m);
  }
  return target;
}

v258 а делать то мне что с этим ?))))
у вас есть вариант для тупых и ленивых ?)))
а то я от туда даже Ёё вырезать не могу…

Для адафрутовской библиотеки есть адаптация. А вообще тексты и цифры лучше картинками выводить…хотя в библиотеках и так картинки :slight_smile:

Распечатать, поместить в рамочку и повесить на стенку. Иначе ничего не получится :wink:

мне кажется только так надо делать, пробовал готовые библиотеки ставить, но там не передается текст из поля на веб сервере… вот так удается передать на дисплей с сайта

злой вы дядя))) я тут через силу искал варианты, перебирал, а они не работают… у меня травма… надо отдохнуть, и если силы восстановятся может еще попробую, но если кто то знает хотя бы как Ёё вывести, подскажите

Я возился с этим вопросом. Надо теорию понимать, если учился программировать. Надпись “Привет Вася” это последовательность чисел в той или иной кодировке, которая приходит в Ардуино. Задача сопоставить каждому числу или паре чисел свою картинку буквы из массива. Я делал с помощью форумчан вывод прописных букв… Но все нюансы благополучно забыл.


…кстати на букву ё забил и делать её вывод не стал :slight_smile:

lilik делать 255 картинок для всех символов, возможно 225 или 162 - не помню сколько, это слишком долго))) что бы картинки выводить в место текста)))

Я тебе по секрету скажу: текст - это последовательность символов. А любой символ - это картинка. Любой шрифт - это набор символов (сиречь - картинок). Ты хочешь масло масляное :wink:

Но именно так всё и устроено в библиотеках :slight_smile:
Бери готовые картинки-шрифты и навигацию по ним организуй.

я хочу что бы подсказали как выводить и русские и английские буквы и символы в строке,(а не по отдельности только) и две буквы Ёё и (желательно сделали за меня, с кодом моим, который после небольших переделок должен идти почти на всем, и работать с устройствами пк или телефоном) а то я что то временно устал от кода))) мозг ленится… и сил пока что нет

Найти в интернете уже готовую русификацию библиотеки и не мучиться, раз думать не хочешь. Я брал на примере адафрукт, там и ёё имеет место быть правильным.

…но только опять же упрёшься в кодировку. Написать Вася, привет! в скетче это одно, а послать эту надпись из монитор порта это другое :slight_smile: Короче ищи готовое, на все случаи жизни.

Я, пожалуй, не стану тебе свои хотелки озвучивать :wink:

https://projectalt.ru/publ/arduino_esp8266_i_esp32/obzory_bibliotek/tft_espi_moshhnaja_i_bystraja_biblioteka_dlja_raboty_s_tft_displejami/10-1-0-43#id-14
вроде пытался даже сам сделать так, но не получается захватить символы с веб сервера, в общем сил пока что нет, может кто то сделает за меня))) пока что я буду восстанавливать силы)))

Чудной ты. Кто будет делать и зачем? Ищи готовые проекты. Вот захочешь ты вывести русские буквы на матрицу и привет твоя библиотека для дисплеев :slight_smile: В отличии от адафрукт.

просто вывести русские символы не проблема)))
надо так как в коде который оставил, может кто то сталкивался…
но код не выводит еще 2 русские буквы, и не работает с английскими и русскими буквами

Ну жди, может помогут, кто понимает в чём дело и сталкивался с этим.
…просто многим библиотекарям лень как и тебе и они пишут не дописывая, то ё не выводится, то русские с англицкими вместе не идут, то с ПК на ардуино не выводит символы.

ну а что я теряю?!)))
пальцами постучал, помогут экономия времени, нет и ладно)))
может кому то этот код еще пригодится, если обычным способом не будет выводиться…

А в чем разница между “в строке” и по отдельности? Строка - это отдельные буквы, поставленные одна за другой

У него мозг ленится ))