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

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

Сб сен 25, 2021 01:11:32

Всем привет! Не могу заставить работать перекодировки из 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

А чем 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

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

Кирилица 2 байтовая к примеру буква русская "А" - 0xD0, 0х90, далее
с русской "р" - 0хD1,0х80. На выходе представлленым вами, получается в массив не положил перекодированную строку?

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

Сб сен 25, 2021 09:14:43

neid писал(а):получается в массив не положил перекодированную строку?
А какую он положил строку? И для чего вам эта перекодировка?

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

Сб сен 25, 2021 10:03:16

На вопрос для чего для начала проверить его работу перед применение где либо.
Далее для начала написал код для перекодирования, чтобы кириллица полностью отображалась...
В том то и дело что, это соответствует 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

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

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

Сб сен 25, 2021 12:48:18

Да удивительно, как некоторые, заморачиваются давно решенными вопросами.

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

Сб сен 25, 2021 13:23:11

кодировох дохрена разных... вапрос с юником тоже решен

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

Сб сен 25, 2021 13:51:46

Не надо ни чего добавлять и кодировать, не изобретайте "велосипед"

Спасибо за ликбез! Я же говорю дальше применять, есть в проекте библиотека шрифта font6x8.c, в которой прописаны все символы по 255("я"), ну и вывод же конечно предпринимается не в терминал а на экран тв по av входу. Аля TVout от ардуино. Вот для чего мне перекодировка. Точнее все уже сделано, и выводить по символьно русский символы я могу, float, и т. д. ... Хочется русский текст вот и изучаю эту тему.
К примеру TV. print(0,12,"Я балбес!")

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

Сб сен 25, 2021 14:29:26

Ну вот, а мы то думали, с терминалом проблема, а оно оказывается как
neid писал(а):Аля TVout от ардуино

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

Сб сен 25, 2021 15:51:17

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

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

Сб сен 25, 2021 16:18:36

$ 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 писал(а):И для чего вам эта перекодировка?
neid писал(а): но вывода почему то нет даже просто в терминале...
neid писал(а):Аля TVout от ардуино.
Причем тут терминал и TVout?, конкретнее бы выражался и сарказма бы не было.
А для TVout от ардуино есть соответствующая тема -> Arduino

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

Сб сен 25, 2021 17:53:02

а у меня есть вопросы:
1. а как в МК попала UTF-8?
2. а почему нельзя было сразу в МК засунуть Windows1251?

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

Сб сен 25, 2021 18:03:38

UTF международный стандарт. Как я уже говорил, пора бы уже переработать периферию микроконтроллеров.
Например UART родился из ASCI, пора родить периферию под UTF. Обязательно с поддержкой OLE.

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

Сб сен 25, 2021 18:35:49

конкретнее бы выражался и сарказма бы не было.
А для TVout от ардуино есть соответствующая тема -> Arduino

А отладить код через терминал нельзя, когда перекодируется хотя бы один символ, потом проверил все символы, делалось так, это о терминале...
Ну я же сказал аля tvout, пишу я то я в студии, я свой ребята, пустите!)))

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

Сб сен 25, 2021 18:39:17

AlexS4,

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

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

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

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

Сб сен 25, 2021 19:25:46

или непонял вопрос тс. я понял так что нужно получить массив смещений для фонта упакованного для 1251. тогда нужно отбросить префикс баайты вроде 0xD0 0xD1 и преобразовать изначащий байт под 1251. (это впоследствии позволит делать font[c] тоесть умножить на размер обьекта, добавить указатель начала и получить указатель на растр или что там за фонт.)

Выложу библиотеку шрифта! Уже говорил что вывод на экран успешен, если по символам выводить.
Вложения
font6x8.cpp
Особо ну пугайтесь, половина BIN записи, половина HEX
(20.43 KiB) Скачиваний: 130

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

Сб сен 25, 2021 19:42:14

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

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