sergeus 0 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Здравствуйте. Никак не могу разобраться с проблемой вывода русского шрифта на дисплей (128*64 ssd1306) u8g_DrawStr(&u8g, 0, 25, "АБВГДЕЖЗИЙКЛМНОП"); - выводит текст РСТУФХЦЧШЩЪЫЬЄЮЯ u8g_DrawStr(&u8g, 0, 38, "РСТУФХЦЧШЩЪЫЬЭЮЯ"); - выводит текст абвгдежзийклмноп Таблица символов этого шрифта (картинкой): http://radiomanoff.at.ua/u8g_font_unifont_0_8.png Пытался задавать смещение в строковые символы - но понятно, что в Atmel Studio русские шрифты хранятся в UTF-8 или др. кодировке и соотв. требуется два байта для хранения и простым инкрементированием/декрементированием значения символа не обойтись. Пытался также сам создавать шрифт по данной инструкции (используя bdf2u8g.exe): http://microsin.net/programming/avr/u8glib...s-overview.html - но результат тот же. Опять выводимые символы смещены на 16 символов относительно необходимых. Выводимые данные храню в строке, типа: char output_s[] = "абвгде АБВГД 123456"; Помогите, пожалуйста, разобраться, как быть со шрифтами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Если написать "АБВГДЕЖЗИЙКЛМНОП" в кодировке windows-1251, и перекодировать в кодировку ISO-8859-5, то как раз получится "РСТУФХЦЧШЩЪЫЬЭЮЯ". Отсюда два вывода: Тексты у вас не в юникоде, а в обычной виндовой кодировке windows-1251; эта либа выводит текст в кодировке ISO-8859-5. Значит, вам надо или сохранять свои тексты в этой кодировке, или перекодировать перед отправкой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Дебаггером посмотрите, что передается и как рисуется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeus 0 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба АНТОХА, спасибо за помощь! Сделал, как вы советовали и получилось. Оказывается код у меня написан в windows-1251, а дисплей понимает в ISO-8859-5. Я в редакторе Notepad++ создаю текст в кодировке ISO-8859-5 и потом перекодирую в windows-1251, т.е. делаю обратную конвертацию. Не совсем удобно конечно смотреть на кракозябры в компиляторе char text[] = "їаШТХвт"; - но зато на дисплее "Привет". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Не совсем удобно конечно смотреть на кракозябры в компиляторе char text[] = "їаШТХвт"; - но зато на дисплее "Привет". Сделайте свой внутренний перекодировщик и всегда вызывайте его перед выводом на экран. Тогда у вас будет понятно что в исходнике и то что нужно при выводе на дисплей. Метод универсальный и очень удобный. Программист должен думать о программе, а не тратить время на перекодирование текста в кракозяблы. Если уж идет борьба за вычислительные мощности (хотя в 99% случаев это борьба надуманная и ненужная для функции вывода на экран) - то после отладки перекодируете все тексты в исходнике в выводимые кракозяблы, а функцию конвертера переопределите как пустышку через #define. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeus 0 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Руслан, не подскажите, какие-нибудь ссылки, на то как реализовать. Я нашел только одну статью: http://delphisite.ru/faq/perekodirovanie-i...irovok-v-drugie Возник еще вопрос, char word[] = "Абвгд"; как физически записывается этот код во флэш память - он занимает сколько байт, верно ли я понимаю, что русские буквы занимают по 2байта (если и английские с русскими то тоже по 2)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Руслан, не подскажите, какие-нибудь ссылки, на то как реализовать. Перекодировщик символа? Лементарно. char newtable={}; //тут символы которые выводятся вместо записанных в исходнике, все 256 или сколько их там нужно в коде: char decode (char in) { return newtable[in]; } Если строка- то в цикле while ( !='\0') всю строку перебираете по символу. Открыл приведенную Вами ссылку- по смыслу то же самое что я написал выше, и таблицы уже есть. :) Возник еще вопрос, char word[] = "Абвгд"; как физически записывается этот код во флэш память - он занимает сколько байт, верно ли я понимаю, что русские буквы занимают по 2байта (если и английские с русскими то тоже по 2)? Извините, я не понял вопроса. Почему по 2 байта? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeus 0 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Возник еще вопрос, char word[] = "Абвгд"; как физически записывается этот код во флэш память - он занимает сколько байт, верно ли я понимаю, что русские буквы занимают по 2байта (если и английские с русскими то тоже по 2)? Извините, я не понял вопроса. Почему по 2 байта? Сама по себе кодировка windows-1251 или ISO-8859-5 как я понимаю требует более одного байта на символ, как происходит "проекция" в однобайтные символы, и как потом отличить, например, записанный китайский иероглиф от русской буквы? Как компилятор и библиотека u8glib понимают, что в строке записан русский символ, а не символ другого языка? Впервые столкнулся с работой со шрифтами, поэтому пока такие простые вопросы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Нет, и windows-1251 и ISO-8859-5 - это однобайтовые кодировки. Они обе русские, японских и других символов там нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 16 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Сама по себе кодировка windows-1251 или ISO-8859-5 как я понимаю требует более одного байта на символ, как происходит "проекция" в однобайтные символы, и как потом отличить, например, записанный китайский иероглиф от русской буквы? Как компилятор и библиотека u8glib понимают, что в строке записан русский символ, а не символ другого языка? Впервые столкнулся с работой со шрифтами, поэтому пока такие простые вопросы. Хм, что-то не то Вы прочитали.... это все 8-битовые коды("страницы"), первая же ссылка при гуглении ведет в википедию Windows-1251 — набор символов и кодировка, являющаяся стандартной 8-битной кодировкой для русских версий Microsoft Windows до 10-й версии. ISO 8859 — семейство ASCII-совместимых кодовых страниц, разработанное совместными усилиями ISO и IEC. По состоянию на 2006 год это семейство состояло из 15-ти кодовых страниц. кодировка символов и кодовые страницы- это азы, так сказать. Лучше немного почитать и разобраться, если не сталкивались раньше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба кодировка символов и кодовые страницы- это азы, так сказать. Лучше немного почитать и разобраться, если не сталкивались раньше. ISO 8859-5 — 8-битная кодовая страница из семейства кодовых страниц стандарта ISO-8859 для представления кириллицы, это здесь. Речь шла о конкретной странице, а не семействе, которая указана в группе. Использую такой подход для борьбы с кодировками: проект в Eclipse (debian, utf8). В отдельный файл в виде #define вынесены все строки, отображаемые на дисплее в cp1251 (шрифт), название, например, mystring.h. Этот заголовочный файл не включается в файлы с кодом, там включен не существующий файл mystring_1251.h. При сборке программы в makefile указана как одна из целей mystring_1251.h, получаемая вызовом перекодировщика (например, recode) для mystring.h. Проект собирается с сгенерированным файлом в нужной кодировке. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Использую такой подход для борьбы с кодировками: проект в Eclipse (debian, utf8). Я сделал проще (Eclipse, ubuntu, utf-8): назначил файлу с текстовыми строками нужную кодировку, и всё:) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 12 сентября, 2016 Опубликовано 12 сентября, 2016 · Жалоба Я сделал проще (Eclipse, ubuntu, utf-8): назначил файлу с текстовыми строками нужную кодировку, и всё:) Согласен, но если собирать из командной строки (без eclipse) и надо что-то подправить быстро простым (тупым) текстовым редактором, то крокозябры на лицо. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeus 0 23 сентября, 2016 Опубликовано 23 сентября, 2016 · Жалоба AHTOXA, Ruslan1, спасибо за помощь! :beer: P.S. Ваши советы пригодились - разобрался со всем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться