Обсуждаем контроллеры компании Atmel.
Сб сен 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);
/*----------*/
Сб сен 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'
Сб сен 25, 2021 08:52:12
А чем UTF-8 от Windows1251 отличается?
Кирилица 2 байтовая к примеру буква русская "А" - 0xD0, 0х90, далее
с русской "р" - 0хD1,0х80. На выходе представлленым вами, получается в массив не положил перекодированную строку?
Сб сен 25, 2021 09:14:43
neid писал(а):получается в массив не положил перекодированную строку?
А какую он положил строку? И для чего вам эта перекодировка?
Сб сен 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' конец строки
Сб сен 25, 2021 11:57:47
neid писал(а):но вывода почему то нет даже просто в терминале...
Не надо ни чего добавлять и кодировать, не изобретайте "велосипед"
Сб сен 25, 2021 12:48:18
Да удивительно, как некоторые, заморачиваются давно решенными вопросами.
Сб сен 25, 2021 13:23:11
кодировох дохрена разных... вапрос с юником тоже решен
Сб сен 25, 2021 13:51:46
Не надо ни чего добавлять и кодировать, не изобретайте "велосипед"
Спасибо за ликбез! Я же говорю дальше применять, есть в проекте библиотека шрифта font6x8.c, в которой прописаны все символы по 255("я"), ну и вывод же конечно предпринимается не в терминал а на экран тв по av входу. Аля TVout от ардуино. Вот для чего мне перекодировка. Точнее все уже сделано, и выводить по символьно русский символы я могу, float, и т. д. ... Хочется русский текст вот и изучаю эту тему.
К примеру TV. print(0,12,"Я балбес!")
Сб сен 25, 2021 14:29:26
Ну вот, а мы то думали, с терминалом проблема, а оно оказывается как
neid писал(а):Аля TVout от ардуино
Сб сен 25, 2021 15:51:17
Dimon456, что за сарказм?думать за других впереди паровоза вы умеете, я уже прочуствовал не в одной теме)) Мысли то есть по поводу кода? Да и как бы написал что буду применять его потом, как еще опять не так выразился))
Сб сен 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 байт на индекс.
Сб сен 25, 2021 16:59:37
Dimon456 писал(а):И для чего вам эта перекодировка?
neid писал(а): но вывода почему то нет даже просто в терминале...
neid писал(а):Аля TVout от ардуино.
Причем тут терминал и TVout?, конкретнее бы выражался и сарказма бы не было.
А для TVout от ардуино есть соответствующая тема ->
Arduino
Сб сен 25, 2021 17:53:02
а у меня есть вопросы:
1. а как в МК попала UTF-8?
2. а почему нельзя было сразу в МК засунуть Windows1251?
Сб сен 25, 2021 18:03:38
UTF международный стандарт. Как я уже говорил, пора бы уже переработать периферию микроконтроллеров.
Например UART родился из ASCI, пора родить периферию под UTF. Обязательно с поддержкой OLE.
Сб сен 25, 2021 18:35:49
конкретнее бы выражался и сарказма бы не было.
А для TVout от ардуино есть соответствующая тема ->
ArduinoА отладить код через терминал нельзя, когда перекодируется хотя бы один символ, потом проверил все символы, делалось так, это о терминале...
Ну я же сказал
аля tvout, пишу я то я в студии, я свой ребята, пустите!)))
Сб сен 25, 2021 19:15:21
Dimon456, чет я туго соображаю, не понял твой ответ. или непонял вопрос тс. я понял так что нужно получить массив смещений для фонта упакованного для 1251. тогда нужно отбросить префикс баайты вроде 0xD0 0xD1 и преобразовать изначащий байт под 1251. (это впоследствии позволит делать font[c] тоесть умножить на размер обьекта, добавить указатель начала и получить указатель на растр или что там за фонт.)
Сб сен 25, 2021 19:25:46
или непонял вопрос тс. я понял так что нужно получить массив смещений для фонта упакованного для 1251. тогда нужно отбросить префикс баайты вроде 0xD0 0xD1 и преобразовать изначащий байт под 1251. (это впоследствии позволит делать font[c] тоесть умножить на размер обьекта, добавить указатель начала и получить указатель на растр или что там за фонт.)
Выложу библиотеку шрифта! Уже говорил что вывод на экран успешен, если по символам выводить.
- Вложения
-
- font6x8.cpp
- Особо ну пугайтесь, половина BIN записи, половина HEX
- (20.43 KiB) Скачиваний: 130
Сб сен 25, 2021 19:42:14
AlexS4, ни что не надо преобразовывать, это neid мозги парит себе и людям, надо просто посмотреть как выводится строка в этом самом TVout от ардуино.
Судя по font6x8.cpp буковки от А до я стоят на своих местах.
Откуда он взял и для чего D0 D1 - загадка.
Мне лень эту среду устанавливать с ее библиотеками, если он полностью проект выложит - может тогда еще гляну. А так пусть пишет в соответствующий раздел форума.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.