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

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4096656#p4096656"]AlexS4, ни что не надо преобразовывать, это neid мозги парит себе и людям. Судя по font6x8.cpp буковки от А до я стоят на своих местах..[/uquote]
ну я себе парю ладно, вам то мне зачем это делать?))

Код: Выделить всё

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  т
Я так понимаю с ними надо бороться.
[uquote="Dimon456",url="/forum/viewtopic.php?p=4096656#p4096656"]AlexS4, если он полностью проект выложит - может тогда еще гляну. А так пусть пишет в соответствующий раздел форума.[/uquote]
Надо будет выложу, объясните мне вот выше сказанное мной. Там переделок минималка. Я не на что не претендую, пишу код для себя и под свои нужды, поделка для себя, стесняться мне не чего.
Последний раз редактировалось neid Сб сен 25, 2021 21:33:19, всего редактировалось 1 раз.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

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

Код: Выделить всё

TV. print(0,12,PSTR("Я балбес!"));
ohmycode!
primuss3.com
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

Это все что касается вывода строк в этой библиотеке
Вложения
TVout.h
(4.24 КБ) 125 скачиваний
TVoutPrint.cpp
(6.41 КБ) 120 скачиваний
TVout.cpp
(18.62 КБ) 125 скачиваний
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

neid, и что у тебя на это

Код: Выделить всё

TV. print(0,12,"Я балбес!")
всего один символ выводится?
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4096720#p4096720"]neid, и что у тебя на это

Код: Выделить всё

TV. print(0,12,"Я балбес!")
всего один символ выводится?[/uquote]
Не один, строка кракозябр... что то типа "P P P P P P P!" жаль нет с собой шнурка с тюльпанами, я на даче. Подцепил бы к тв, прислал фото. а
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

А на это

Код: Выделить всё

TV. print(0,12,"Hello, world!")
Реклама
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4096725#p4096725"]А на это

Код: Выделить всё

TV. print(0,12,"Hello, world!")
[/uquote]
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*С
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Все, я увидел, но только завтра.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

осталось попробовать:

Код: Выделить всё

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, 'Д');
ohmycode!
primuss3.com
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6668
Зарегистрирован: Пт сен 10, 2021 15:19:36
Откуда: Протвино

Сообщение AlexS4 »

neid, прочитай мой 1й пост.
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="AlexS4",url="/forum/viewtopic.php?p=4096574#p4096574"]толи я торможу толи непонятно как ты проверяешь/пропускаешь левый байт пар, получаяя указатель на unsigned char тоесть 1 байт на индекс.[/uquote]
Я тебе в личке написал по этому поводу...
Друг Кота
Аватара пользователя
Сообщения: 6668
Зарегистрирован: Пт сен 10, 2021 15:19:36
Откуда: Протвино

Сообщение AlexS4 »

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


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

Сообщение slav0n »

а вручную перекодировать исходник из ютф в аски не судьба?
винавр это делает за пару кликов
и не надо никаких костылей
Вложения
ASCII.png
(22.75 КБ) 107 скачиваний
ohmycode!
primuss3.com
Контактная информация:
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="slav0n",url="/forum/viewtopic.php?p=4097030#p4097030"]а вручную перекодировать исходник из ютф в аски не судьба?
винавр это делает за пару кликов
и не надо никаких костылей[/uquote]
Чем не довольны!? Коментарии не читаемы? Я в студии работаю... Кстати вопрос, вы не знаете как, работают недавно, не нашел смену кодировки(((
Последний раз редактировалось neid Вс сен 26, 2021 19:20:47, всего редактировалось 1 раз.
Друг Кота
Аватара пользователя
Сообщения: 6668
Зарегистрирован: Пт сен 10, 2021 15:19:36
Откуда: Протвино

Сообщение AlexS4 »

[uquote="slav0n",url="/forum/viewtopic.php?p=4097030#p4097030"]а вручную перекодировать исходник из ютф в аски не судьба?
винавр это делает за пару кликов
и не надо никаких костылей[/uquote]
а если это динамические входные данные?!

если пресетный текст то конечно в рантайм алгоритме нет никакого смысла.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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, может там еще сдвинуто куда.
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4097116#p4097116"]neid, вы уж определитесь, либо студия, либо TVout от ардуино.
либо это сюрпрайз от ардуиноиде, либо это особенность С++.[/uquote]
думаю все ж C++.
а что по поводу перфиксов 0xD0 и 0xD1, то их AlexS4 предлагает программно игнорить.

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

Добавлено after 1 hour 6 minutes 2 seconds:
[uquote="Dimon456",url="/forum/viewtopic.php?p=4097116#p4097116"]]преобразуется ардуиноиде в последовательность[/uquote]
У меня такое

Код: Выделить всё

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]
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

у меня студии нет.
что-то не верю, чтоб редактор студии не позволял менять кодировку в свойствах файла.
ТС уже б давно кириллицу узрел на своем ящике и без танцев с бубном
ohmycode!
primuss3.com
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

Сообщение slav0n »

ну, хотя бы, шоб не морочить голову с самописным парсером. латин - 8бит, кирилл - 16...
а так все символы однобайтные - красота
ohmycode!
primuss3.com
Контактная информация:
Ответить

Вернуться в «AVR»