Обсуждаем контроллеры компании 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[] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";  // исходная строчка кириллицей
преобразуется ардуиноиде в последовательность
Спойлер
Код:
m   00800106   byte[133]
m[0]   0x0106   0xD0
m[1]   0x0107   0x90
m[2]   0x0108   0xD0
m[3]   0x0109   0x91
m[4]   0x010A   0xD0
m[5]   0x010B   0x92
m[6]   0x010C   0xD0
m[7]   0x010D   0x93
m[8]   0x010E   0xD0
m[9]   0x010F   0x94
m[10]   0x0110   0xD0
m[11]   0x0111   0x95
m[12]   0x0112   0xD0
m[13]   0x0113   0x81
m[14]   0x0114   0xD0
m[15]   0x0115   0x96
m[16]   0x0116   0xD0
m[17]   0x0117   0x97
m[18]   0x0118   0xD0
m[19]   0x0119   0x98
m[20]   0x011A   0xD0
m[21]   0x011B   0x99
m[22]   0x011C   0xD0
вся последовательность не приводится
либо это сюрпрайз от ардуиноиде, либо это особенность С++.

А далее:
если первый байт масива 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);


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

Спойлер
Код:
208 , 0
144 , 192
208 , 0
145 , 183
208 , 0
146 , 194
208 , 0
147 , 195
208 , 0
148 , 196
208 , 0
149 , 197
208 , 0
129 , 168
208 , 0
150 , 198
208 , 0
151 , 199
208 , 0
152 , 200
208 , 0
153 , 201
208 , 0
154 , 202
208 , 0
155 , 203
208 , 0
156 , 204
208 , 0
157 , 205
208 , 0
158 , 206
208 , 0
159 , 207
208 , 0
160 , 208
208 , 0
161 , 209
208 , 0
162 , 210
208 , 0
163 , 211
208 , 0
164 , 212
208 , 0
165 , 213
208 , 0
166 , 214
208 , 0
167 , 215
208 , 0
168 , 216
208 , 0
169 , 217
208 , 0
170 , 218
208 , 0
171 , 219
208 , 0
172 , 220
208 , 0
173 , 221
208 , 0
174 , 222
208 , 0
175 , 223
208 , 0
176 , 224
208 , 0
177 , 225
208 , 0
178 , 226
208 , 0
179 , 227
208 , 0
180 , 228
208 , 0
181 , 229
209 , 1
145 , 183
208 , 0
182 , 230
208 , 0
183 , 231
208 , 0
184 , 232
208 , 0
185 , 233
208 , 0
186 , 234
208 , 0
187 , 235
208 , 0
188 , 236
208 , 0
189 , 237
208 , 0
190 , 238
208 , 0
191 , 239
209 , 1
128 , 240
209 , 1
129 , 168
209 , 1
130 , 242
209 , 1
131 , 243
209 , 1
132 , 244
209 , 1
133 , 245
209 , 1
134 , 246
209 , 1
135 , 247
209 , 1
136 , 248
209 , 1
137 , 249
209 , 1
138 , 250
209 , 1
139 , 251
209 , 1
140 , 252
209 , 1
141 , 253
209 , 1
142 , 254
209 , 1
143 , 255

массив 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...
а так все символы однобайтные - красота
Ответить