Обсуждаем контроллеры компании Atmel.
Ответить

Re: перекодировки с UTF-8 в Windows1251

Сб сен 25, 2021 21:00:35

AlexS4, ни что не надо преобразовывать, это neid мозги парит себе и людям. Судя по font6x8.cpp буковки от А до я стоят на своих местах..

ну я себе парю ладно, вам то мне зачем это делать?))
Код:
int utf8_rus(char* dest, const unsigned char* src) {
 
  unsigned int i, j;
 
  for ( i =0, j=0; src[i]; i++) {
    
   
   if (src[i] >= 0x90) { dest[++j] = src[i] + 0x2F; //D0 c 144 по 191 
                                 
         } else {if (src[i] >= 0x80) {dest[++j] = src[i] + 0x6F; //D1 с 128 по 143
                                                
                     } else {dest[++j] = src[i];}
   }
   if (src[i]== 0x91) { dest[++j] = 0xB7;} //Ё
   if (src[i]== 0x81) { dest[++j] = 0xA8;} //ё
   code=src[i];
   code2=dest[j];
   itoa(code, buffer_USART, 10);
   USART_sendLine(buffer_USART);
   
   USART_sendLine(" , ");
   
   itoa(code2, buffer_USART, 10);
   USART_sendLine(buffer_USART);
   USART_sendLine("\n\r");
  } //end for
  dest[j] ='\0';
  return j;
}

/---------- код---------------
const unsigned char m[] = "АБВрст";  // исходная строчка кириллицей
char k[10];        // сюда будем записывать результат перекодировки
utf8_rus(k,m);


вывод в терминале, вот откуда я их взял

Код:
208 , 255  - 0xDO
144 , 191 - 191 = А или Win-1251
208 , 255    0xDO
145 , 183   183, т.к. if (src[i]== 0x81) { dest[++j] = 0xA8;} //ё
208 , 255   0xD0
146 , 193  В
209 , 0     0xD1
128 , 239  р
209 , 0     0xD1
129 , 168  c   168, т.к.  if (src[i]== 0x91) { dest[++j] = 0xB7;} //Ё а не 192
209 , 0     0xD1
130 , 241  т

Я так понимаю с ними надо бороться.
AlexS4, если он полностью проект выложит - может тогда еще гляну. А так пусть пишет в соответствующий раздел форума.

Надо будет выложу, объясните мне вот выше сказанное мной. Там переделок минималка. Я не на что не претендую, пишу код для себя и под свои нужды, поделка для себя, стесняться мне не чего.
Последний раз редактировалось neid Сб сен 25, 2021 21:33:19, всего редактировалось 1 раз.

Re: перекодировки с UTF-8 в Windows1251

Сб сен 25, 2021 21:15:24

neid писал(а):Выложу библиотеку шрифта!
такой шрифт и для AVR... не, нафиг-нафиг
Нормальный шрифт 6х8 помещается в 5 байт на символ и выглядит крупнее.

neid писал(а):К примеру TV. print(0,12,"Я балбес!")
это делается примерно так:
Код:
TV. print(0,12,PSTR("Я балбес!"));

Re: перекодировки с UTF-8 в Windows1251

Сб сен 25, 2021 21:26:48

Это все что касается вывода строк в этой библиотеке
Вложения
TVout.h
(4.24 KiB) Скачиваний: 106
TVoutPrint.cpp
(6.41 KiB) Скачиваний: 102
TVout.cpp
(18.62 KiB) Скачиваний: 105

Re: перекодировки с UTF-8 в Windows1251

Сб сен 25, 2021 21:39:33

neid, и что у тебя на это
Код:
TV. print(0,12,"Я балбес!")
всего один символ выводится?

Re: перекодировки с UTF-8 в Windows1251

Сб сен 25, 2021 21:45:12

neid, и что у тебя на это
Код:
TV. print(0,12,"Я балбес!")
всего один символ выводится?

Не один, строка кракозябр... что то типа "P P P P P P P!" жаль нет с собой шнурка с тюльпанами, я на даче. Подцепил бы к тв, прислал фото. а

Re: перекодировки с UTF-8 в Windows1251

Сб сен 25, 2021 21:48:06

А на это
Код:
TV. print(0,12,"Hello, world!")

Re: перекодировки с UTF-8 в Windows1251

Сб сен 25, 2021 22:02:12

А на это
Код:
TV. print(0,12,"Hello, world!")

Hello, world!

на это
Код:
TV.clear_screen();
TV.print_char(32, 0, 0xCA);
TV.print_char(40, 0, 0xCE);
TV.print_char(48, 0, 0xD2);
TV.print_char(56, 0, 0xA8);
TV.print_char(64, 0, 0xCB);
TV.print_char(72, 0, 0x20); //"_"
TV.print_char(80, 0, 0xA8);
TV.print_char(88, 0, 0xC6);
TV.print_char(96, 0, 0xC8);
TV.print_char(104, 0, 0xCA);

TV.print(0, 12, T, 1); //температура с термистора, 1 - один знак после запятой
TV.print("@C"); // @-знак градус


КОТЁЛ ЁЖИК
25,5*С

Re: перекодировки с UTF-8 в Windows1251

Сб сен 25, 2021 22:07:30

Все, я увидел, но только завтра.

Re: перекодировки с UTF-8 в Windows1251

Сб сен 25, 2021 23:39:36

осталось попробовать:
Код:
TV.print_char(32, 0, 'А');
TV.print_char(40, 0, 'Б');
TV.print_char(48, 0, 'В');
TV.print_char(56, 0, 'Г');
TV.print_char(64, 0, 'Д');

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 01:01:32

neid, прочитай мой 1й пост.

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 09:29:59

толи я торможу толи непонятно как ты проверяешь/пропускаешь левый байт пар, получаяя указатель на unsigned char тоесть 1 байт на индекс.

Я тебе в личке написал по этому поводу...

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 14:11:47

ага ответил, дублирую сюда если комуто еще понадобится


у нас 2 массива или потока но они разной длинны, тоесть пробегаешь входной массив побайтно
и ищешь байты - префиксы последовательности в нашем случае xD0 xD1
если байт != им то просто переписываешь такой байт в выходной массив или поток
если == то НИЧЕГО ПОКА не пишешь в выход а зачитываешь следуюший байт в последовательности и его преобразуешь по формулам или табличке перекодировки, c учетом запомненного заранее преффикса (2 варианта для киррилицы xD0 и xD1. и преобразованный таким способом значащий 1 байт дописываешь в выходной массив или поток.

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 15:30:48

а вручную перекодировать исходник из ютф в аски не судьба?
винавр это делает за пару кликов
и не надо никаких костылей
Вложения
ASCII.png
(22.75 KiB) Скачиваний: 83

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 17:21:00

а вручную перекодировать исходник из ютф в аски не судьба?
винавр это делает за пару кликов
и не надо никаких костылей

Чем не довольны!? Коментарии не читаемы? Я в студии работаю... Кстати вопрос, вы не знаете как, работают недавно, не нашел смену кодировки(((
Последний раз редактировалось neid Вс сен 26, 2021 19:20:47, всего редактировалось 1 раз.

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 17:31:50

а вручную перекодировать исходник из ютф в аски не судьба?
винавр это делает за пару кликов
и не надо никаких костылей

а если это динамические входные данные?!

если пресетный текст то конечно в рантайм алгоритме нет никакого смысла.

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 17:59:41

neid, вы уж определитесь, либо студия, либо TVout от ардуино.

Начнем с ардуиноиде: строка вида
Код:
const char m[] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";  // исходная строчка кириллицей
преобразуется ардуиноиде в последовательность
либо это сюрпрайз от ардуиноиде, либо это особенность С++.

А далее:
если первый байт масива xD0, то ко второму байту прибавляем x30,
если первый байт масива xD1, то ко второму байту прибавляем x70

Еще надо бы потрести font6x8.cpp, может там еще сдвинуто куда.

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 20:25:04

neid, вы уж определитесь, либо студия, либо TVout от ардуино.
либо это сюрпрайз от ардуиноиде, либо это особенность С++.

думаю все ж C++.
а что по поводу перфиксов 0xD0 и 0xD1, то их AlexS4 предлагает программно игнорить.

СПАСИБО ВСЕМ ОТКЛИКНУВШИМСЯ В ПОМОЩИ!

Добавлено after 1 hour 6 minutes 2 seconds:
]преобразуется ардуиноиде в последовательность

У меня такое
Код:
const char m[] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя"; // исходная строчка кириллицей
char k[200];        //33 буквы
utf8_rus(k,m);


ответ в терминале


массив k[200]

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 20:46:12

у меня студии нет.
что-то не верю, чтоб редактор студии не позволял менять кодировку в свойствах файла.
ТС уже б давно кириллицу узрел на своем ящике и без танцев с бубном

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 22:05:41

slav0n писал(а):ТС уже б давно кириллицу узрел на своем ящике и без танцев с бубном
Ящик у него на ардуино, а он за чем-то студию заводит.
Ардуино дает готовый код 0xD0+0x90, нужно преобразовать к символу 0xС0.
За чем нужно обратное преобразование в студии?

Re: перекодировки с UTF-8 в Windows1251

Вс сен 26, 2021 22:18:29

ну, хотя бы, шоб не морочить голову с самописным парсером. латин - 8бит, кирилл - 16...
а так все символы однобайтные - красота
Ответить