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

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

Сообщение neid »

Всем привет! Не могу заставить работать перекодировки из UTF-8 в Windows1251. Не выдает результат как не бился...
Что то не так делаю, может принцип сам не понимаю перекодировки. Кто подскажет более свежим опытным взглядом?

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

/*--------------------------------------------------------------------------------------
  UTF8  функция перекодировки
---------------------------------------------------------------------------------------*/
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] + 0x30; //D0 c 144 по 191  
											
			} else {if (src[i] >= 0x80) {dest[++j] = src[i] + 0x70; //D1 с 128 по 143
																
							} else {dest[++j] = src[i];}
	}
	if (src[i]== 0x91) { dest[j] = 0xB7;} //Ё
	if (src[i]== 0x81) { dest[j] = 0xA8;} //ё		
    
  } //end for
   
  dest[j] ='\0';
  return j; 
}

/----в основном коде-------------
const unsigned char m[] = "АБВГД";  // исходная строчка кириллицей
char k[10];        // сюда будем записывать результат перекодировки			
utf8_rus(k,m);
USART_sendLine(k);
/*--------------------------------------------------------------------------------------*/
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

А чем UTF-8 от Windows1251 отличается?

Учитывая что

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

const unsigned char m[] = "АБВГД";  // исходная строчка кириллицей
на выходе выдает

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

m	00800100	byte[6]
m[0]	0x0100	0xC0 
m[1]	0x0101	0xC1 
m[2]	0x0102	0xC2 
m[3]	0x0103	0xC3 
m[4]	0x0104	0xC4 
m[5]	0x0105	'\0'
Реклама
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4096366#p4096366"]А чем UTF-8 от Windows1251 отличается?[/uquote]
Кирилица 2 байтовая к примеру буква русская "А" - 0xD0, 0х90, далее
с русской "р" - 0хD1,0х80. На выходе представлленым вами, получается в массив не положил перекодированную строку?
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

neid писал(а):получается в массив не положил перекодированную строку?
А какую он положил строку? И для чего вам эта перекодировка?
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

На вопрос для чего для начала проверить его работу перед применение где либо.
Далее для начала написал код для перекодирования, чтобы кириллица полностью отображалась...
В том то и дело что, это соответствует win1251, но вывода почему то нет даже просто в терминале... возможно надо добавить 1 байт инфы, т.е. 0xD0 или 0xD1. Если взять строку "ABCDE", она полностью отображается в терминале

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

m   00800100   byte[6]  символ
m[0]   0x0100   0xC0         А
m[1]   0x0101   0xC1         Б
m[2]   0x0102   0xC2         В
m[3]   0x0103   0xC3         Г
m[4]   0x0104   0xC4         Д
m[5]   0x0105   '\0'      конец строки
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

neid писал(а):но вывода почему то нет даже просто в терминале...
Не надо ни чего добавлять и кодировать, не изобретайте "велосипед"
Спойлер

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

const char m[] = "АБВГД";  // исходная строчка кириллицей


	printf("\nHello, world!\n");
	puts(m);
	printf("\nАБВГД");
	printf("\nПривет Форум РадиоКот");
	printf("\nПривет radiokot.ru");
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1405
Зарегистрирован: Чт фев 19, 2015 12:41:04

Сообщение astrahard »

Да удивительно, как некоторые, заморачиваются давно решенными вопросами.
"Every profession is a conspiracy against the uninitiated" (B. Shaw)
"A textbook can be defined as a book unsuitable for reading" (B. Shaw)
Tautology is humor in "this" place (Vigo Carpathian)
Друг Кота
Аватара пользователя
Сообщения: 39197
Зарегистрирован: Сб сен 13, 2014 16:27:32
Откуда: СпиртоГонск созвездия Омега

Сообщение musor »

кодировох дохрена разных... вапрос с юником тоже решен
ZМудрость(Опыт и выдержка) приходит с годами.
Все Ваши беды и проблемы, от недостатка знаний.
Умный и у дурака научится, а дураку и ..
Алберт Ейнштейн не поможет и ВВП не спасет.и МЧС опаздает
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4096442#p4096442"]Не надо ни чего добавлять и кодировать, не изобретайте "велосипед"[/uquote]
Спасибо за ликбез! Я же говорю дальше применять, есть в проекте библиотека шрифта font6x8.c, в которой прописаны все символы по 255("я"), ну и вывод же конечно предпринимается не в терминал а на экран тв по av входу. Аля TVout от ардуино. Вот для чего мне перекодировка. Точнее все уже сделано, и выводить по символьно русский символы я могу, float, и т. д. ... Хочется русский текст вот и изучаю эту тему.
К примеру TV. print(0,12,"Я балбес!")
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Ну вот, а мы то думали, с терминалом проблема, а оно оказывается как
neid писал(а):Аля TVout от ардуино
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

Dimon456, что за сарказм?думать за других впереди паровоза вы умеете, я уже прочуствовал не в одной теме)) Мысли то есть по поводу кода? Да и как бы написал что буду применять его потом, как еще опять не так выразился))
Друг Кота
Аватара пользователя
Сообщения: 6668
Зарегистрирован: Пт сен 10, 2021 15:19:36
Откуда: Протвино

Сообщение AlexS4 »

$ locale |grep -i ctype
LC_CTYPE=ru_RU.UTF-8

$ echo "Я бaлбес but 1byte per others"|hd
00000000 d0 af 20 d0 b1 61 d0 bb d0 b1 d0 b5 d1 81 20 62 |.. ..a........ b|
00000010 75 74 20 31 62 79 74 65 20 70 65 72 20 6f 74 68 |ut 1byte per oth|
00000020 65 72 73 0a |ers.|

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

Сообщение Dimon456 »

Dimon456 писал(а):И для чего вам эта перекодировка?
neid писал(а): но вывода почему то нет даже просто в терминале...
neid писал(а):Аля TVout от ардуино.
Причем тут терминал и TVout?, конкретнее бы выражался и сарказма бы не было.
А для TVout от ардуино есть соответствующая тема -> Arduino
Модератор
Аватара пользователя
Сообщения: 19055
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Сообщение Starichok51 »

а у меня есть вопросы:
1. а как в МК попала UTF-8?
2. а почему нельзя было сразу в МК засунуть Windows1251?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1405
Зарегистрирован: Чт фев 19, 2015 12:41:04

Сообщение astrahard »

UTF международный стандарт. Как я уже говорил, пора бы уже переработать периферию микроконтроллеров.
Например UART родился из ASCI, пора родить периферию под UTF. Обязательно с поддержкой OLE.
"Every profession is a conspiracy against the uninitiated" (B. Shaw)
"A textbook can be defined as a book unsuitable for reading" (B. Shaw)
Tautology is humor in "this" place (Vigo Carpathian)
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4096588#p4096588"]конкретнее бы выражался и сарказма бы не было.
А для TVout от ардуино есть соответствующая тема -> Arduino[/uquote]
А отладить код через терминал нельзя, когда перекодируется хотя бы один символ, потом проверил все символы, делалось так, это о терминале...
Ну я же сказал аля tvout, пишу я то я в студии, я свой ребята, пустите!)))
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

AlexS4,
Спойлер$ еchо "Я бaлбес but 1byte per others"|hd
00000000 d0 af 20 d0 b1 61 d0 bb d0 b1 d0 b5 d1 81 20 62 |.. ..a........ b|
00000010 75 74 20 31 62 79 74 65 20 70 65 72 20 6f 74 68 |ut 1byte per oth|
00000020 65 72 73 0a |ers.|

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

k[0]	0x016E	0xD0 
k[1]	0x016F	0xAF 
k[2]	0x0170	0x20 
k[3]	0x0171	0xD0 
k[4]	0x0172	0xB1 
k[5]	0x0173	0x61 
k[6]	0x0174	0xD0 
k[7]	0x0175	0xBB 
k[8]	0x0176	0xD0 
k[9]	0x0177	0xB1 
k[10]	0x0178	0xD0 
k[11]	0x0179	0xB5 
k[12]	0x017A	0xD1 
k[13]	0x017B	0x81 
k[14]	0x017C	0x20 
k[15]	0x017D	0x62 
k[16]	0x017E	0x75 
k[17]	0x017F	0x74 
k[18]	0x0180	0x20 
k[19]	0x0181	0x31 
k[20]	0x0182	0x62 
k[21]	0x0183	0x79 
k[22]	0x0184	0x74 
k[23]	0x0185	0x65 
k[24]	0x0186	0x20 
k[25]	0x0187	0x70 
k[26]	0x0188	0x65 
k[27]	0x0189	0x72 
k[28]	0x018A	0x20 
k[29]	0x018B	0x6F 
k[30]	0x018C	0x74 
k[31]	0x018D	0x68 
k[32]	0x018E	0x65 
k[33]	0x018F	0x72 
k[34]	0x0190	0x73 
k[35]	0x0191	0x00
Друг Кота
Аватара пользователя
Сообщения: 6668
Зарегистрирован: Пт сен 10, 2021 15:19:36
Откуда: Протвино

Сообщение AlexS4 »

Dimon456, чет я туго соображаю, не понял твой ответ. или непонял вопрос тс. я понял так что нужно получить массив смещений для фонта упакованного для 1251. тогда нужно отбросить префикс баайты вроде 0xD0 0xD1 и преобразовать изначащий байт под 1251. (это впоследствии позволит делать font[c] тоесть умножить на размер обьекта, добавить указатель начала и получить указатель на растр или что там за фонт.)
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

[uquote="AlexS4",url="/forum/viewtopic.php?p=4096640#p4096640"]или непонял вопрос тс. я понял так что нужно получить массив смещений для фонта упакованного для 1251. тогда нужно отбросить префикс баайты вроде 0xD0 0xD1 и преобразовать изначащий байт под 1251. (это впоследствии позволит делать font[c] тоесть умножить на размер обьекта, добавить указатель начала и получить указатель на растр или что там за фонт.)[/uquote]
Выложу библиотеку шрифта! Уже говорил что вывод на экран успешен, если по символам выводить.
Вложения
font6x8.cpp
Особо ну пугайтесь, половина BIN записи, половина HEX
(20.43 КБ) 179 скачиваний
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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

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

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