Страница 1 из 4

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

Добавлено: Сб сен 25, 2021 01:11:32
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);
/*--------------------------------------------------------------------------------------*/

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

Добавлено: Сб сен 25, 2021 08:28:01
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'

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

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

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

Добавлено: Сб сен 25, 2021 09:14:43
Dimon456
neid писал(а):получается в массив не положил перекодированную строку?
А какую он положил строку? И для чего вам эта перекодировка?

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

Добавлено: Сб сен 25, 2021 10:03:16
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'      конец строки

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

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

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

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


	printf("\nHello, world!\n");
	puts(m);
	printf("\nАБВГД");
	printf("\nПривет Форум РадиоКот");
	printf("\nПривет radiokot.ru");

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

Добавлено: Сб сен 25, 2021 12:48:18
astrahard
Да удивительно, как некоторые, заморачиваются давно решенными вопросами.

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

Добавлено: Сб сен 25, 2021 13:23:11
musor
кодировох дохрена разных... вапрос с юником тоже решен

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

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

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

Добавлено: Сб сен 25, 2021 14:29:26
Dimon456
Ну вот, а мы то думали, с терминалом проблема, а оно оказывается как
neid писал(а):Аля TVout от ардуино

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

Добавлено: Сб сен 25, 2021 15:51:17
neid
Dimon456, что за сарказм?думать за других впереди паровоза вы умеете, я уже прочуствовал не в одной теме)) Мысли то есть по поводу кода? Да и как бы написал что буду применять его потом, как еще опять не так выразился))

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

Добавлено: Сб сен 25, 2021 16:18: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 байт на индекс.

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

Добавлено: Сб сен 25, 2021 16:59:37
Dimon456
Dimon456 писал(а):И для чего вам эта перекодировка?
neid писал(а): но вывода почему то нет даже просто в терминале...
neid писал(а):Аля TVout от ардуино.
Причем тут терминал и TVout?, конкретнее бы выражался и сарказма бы не было.
А для TVout от ардуино есть соответствующая тема -> Arduino

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

Добавлено: Сб сен 25, 2021 17:53:02
Starichok51
а у меня есть вопросы:
1. а как в МК попала UTF-8?
2. а почему нельзя было сразу в МК засунуть Windows1251?

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

Добавлено: Сб сен 25, 2021 18:03:38
astrahard
UTF международный стандарт. Как я уже говорил, пора бы уже переработать периферию микроконтроллеров.
Например UART родился из ASCI, пора родить периферию под UTF. Обязательно с поддержкой OLE.

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

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

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

Добавлено: Сб сен 25, 2021 18:39:17
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

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

Добавлено: Сб сен 25, 2021 19:15:21
AlexS4
Dimon456, чет я туго соображаю, не понял твой ответ. или непонял вопрос тс. я понял так что нужно получить массив смещений для фонта упакованного для 1251. тогда нужно отбросить префикс баайты вроде 0xD0 0xD1 и преобразовать изначащий байт под 1251. (это впоследствии позволит делать font[c] тоесть умножить на размер обьекта, добавить указатель начала и получить указатель на растр или что там за фонт.)

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

Добавлено: Сб сен 25, 2021 19:25:46
neid
[uquote="AlexS4",url="/forum/viewtopic.php?p=4096640#p4096640"]или непонял вопрос тс. я понял так что нужно получить массив смещений для фонта упакованного для 1251. тогда нужно отбросить префикс баайты вроде 0xD0 0xD1 и преобразовать изначащий байт под 1251. (это впоследствии позволит делать font[c] тоесть умножить на размер обьекта, добавить указатель начала и получить указатель на растр или что там за фонт.)[/uquote]
Выложу библиотеку шрифта! Уже говорил что вывод на экран успешен, если по символам выводить.

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

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

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