Кодировка русских букв компилятором
- Войдите на сайт для отправки комментариев
Сб, 13/08/2022 - 19:52
Я понимаю, что IDE Arduino работает с UTF-8, но в какую кодировку компилятор транслирует русские буквы?
Например, если в скетче написано:
Lcd.Display("АБВГДЕЖЗИ");
то, что будет записано в Atmega?
Компилятор ничего никуда не транслирует. Если файл в ASCI, то в памяти будут коды ASCI. Если файла в UTF-8, то в памяти будут коды UTF-8. Никакой самодеятельностью компилятор не занимается.
Если файла в UTF-8, то в памяти будут коды UTF-8.
Т.е. в памяти будут двухбайтные коды русских букв, как описано тут:
сылка
Ну, да. Можете их вывести в сериал (в цикле байт за байтом) и полюбоваться - ничего сложного.
Мне подсказали, что если сменить кодировку на ср1251, то символы станут однобайтовыми.Т.е., если у меня появилась фантазия использовать русские символы, то при перекодировке в cp1251, я буду экономить один байт на каждый символ?
буду экономить один байт на каждый символ?
Будете. Другой вопрос, что Вы собираетесь делать с этими символами? Например (чисто пример), если Вы собираетесь выводить их на экран, Вы должны понимать какой кодировки ожидает от Вас библиотека экрана. Если она ожидает cp1251, то так и надо делать. Но, если она ожидает UTF-8, то сильно удивится, увидев Вашу cp1251.
Вы должны понимать какой кодировки ожидает от Вас библиотека экрана. Если она ожидает cp1251, то так и надо делать. Но, если она ожидает UTF-8, то сильно удивится, увидев Вашу cp1251.
Библиотека, которую порекомендовал производитель дисплея, допил библиотеки от другого дисплея и не доведена до ума. Библиотека, судя по всему, ждёт только однобайтовые символы. Чисел принципиально не понимает.
Посмотрю исходную. Может пойму как допилить.
А последней фразы я не понимаю. Уверен, что и Вы тоже.
При передаче в библиотеку числа выводится, либо соответствующий ему символ, либо ничего.
Вот так объявлен метод класса:
При передаче в библиотеку числа выводится, либо соответствующий ему символ, либо ничего.
Ну, да. А Вы чего ожидали?
Ну, да. А Вы чего ожидали?
Я ожидал, что магазин, в котором я купил дисплей, пришлёт библиотеку от производителя, а получил сначала не работающую библиотеку, а затем ссылку на недоделанную библиотеку. И это странно.
Почему-то была уверенность, что магазин Estardyn Official Store является ещё и производителем.
А чем она " недоделанная"? Уж не тем ли, что чисел не понимает?
Открою вам секрет - любая графическая библиотека при записи в нее чисел выводит на экран символы. По другому просто не бывает.
Ну а вот недоделанная библиотека выводит недоделанные числа...
Вы читали мой пост #8 ?
Вы читали мой пост #8 ?
Да. читал.
И то. что выше - мой ответ на это сообщение.
А чего вы вообще ждали от библиотеки? Сдается мне, что вам стоит разобраться. чем отличается число 1 от символа '1' и что из них выводится на экран. Подскажу - символ.
и чтобы нарисовать на экране единичку - надо передать библиотеке не число 1, а символ '1'
Вы читали мой пост #8 ?
Я прочел. Что ты хотел сказать? На дисплей передается строка символов (вот этот char *).
Попробую угадать: кириллицу не печатает? ;)))) А должна? Реально исчезающе мало библиотек для экранов, которые содержат кириллические шрифты. Часто бывает можно добавить свой шрифт - их есть на просторах Инета.
Ты бы дал ссылку на эту библиотеку - когда не лень посмотрит кто и подскажет, откуда взять шрифт с кириллицей хоть в какой-нибудь кодировке.
Мир программирования и электроники - он весь англоязычный и весь на латинице... ну еще бывают ДШ на китайском ;)))) но не на кириллице!
--------------------
Ты уж прости старика, просто такие посты о дисплеях, которые "не понимают по русски" - каждую неделю какой-нибудь новичок пишет. В твоей теме хоть глума мало... Попал под хорошее настроение!
Я прочел. Что ты хотел сказать?
Попробую угадать: кириллицу не печатает? ;))))
нет Влад, все хуже! он кидает туда число 65 - а эта "недоделанная либа" вместо "65" печатает "А" !!! Он посылает ей 240 - а она вообще не печатает ничего!
безобразие... никому нельзя верить... он рассчитывал. что хотя в магазине производителя дисплеев порядок...
Я прочел. Что ты хотел сказать? На дисплей передается строка символов (вот этот char *).
[/quote]
Если в прототипе указана строка, то и печатается строка. Если туда передать число, то оно интерпретируется как строка.
Зачем угадывать? Это очевидно из общения. Латиница входит в любую кодировку. И не должна, т.к. анализируются символы от '1' до 'z', плюс кое-какие псеводграфические вот таким образом:
и т.д. Скетч в кодировке UTF-8, т.е. двухбайтовой.
1). Как такой код понимает, что первый байт ноль?
[Если в прототипе указана строка, то и печатается строка. Если туда передать число, то оно интерпретируется как строка.
вопрос - если вы видите, что в прототипе СТРОКА - нафига вы туда число передаете?
1). Как такой код понимает, что первый байт ноль?
никак не понимает. Вы должны явно передать коду ноль. Причем не байт ноль, а символ ноль, то есть байт 48.
У меня такое впечатление, что вы так и не поняли разницу.
никак не понимает. Вы должны явно передать коду ноль. Причем не байт ноль, а символ ноль, то есть байт 48.
У меня такое впечатление, что вы так и не поняли разницу.
Нашёл нормальную таблицу UTF-8. Латиница и цифры занимают один байт, а после 127 символы становятся двухбайтовыми и до 4 байт. Не могли бы вы на примере какой-либо библиотеки разъяснить как метод .print понимает, что получил, строку и в какой кодировке, целое или вещественное число? В С++, если я правильно понимаю, что описано в прототипе, с тем функция и работает. Судя по всему, Arduino построена иначе.
Библиотека, которую я пытаюсь понять взята отсюда:
https://github.com/luetee/ST7567S_128X64_I2C
Как по вашему мнению, она допилена или нет?
Нашёл нормальную таблицу UTF-8. Латиница и цифры занимают один байт, а после 127 символы становятся двухбайтовыми и до 4 байт. Не могли бы вы на примере какой-либо библиотеки разъяснить как метод .print понимает, что получил, строку и в какой кодировке, целое или вещественное число? В С++, если я правильно понимаю, что описано в прототипе, с тем функция и работает. Судя по всему, Arduino построена иначе.
Просили пример библиотеки - получите: https://arduino.ru/forum/proekty/asoled-kompaktnaya-biblioteka-dlya-oled-displeya-128kh64-s-kirillitsei-utf-8
Только никому больше не говорите про отличие Ардуино от С++.
Я всё не пойму в чём проблема? Если на запрос '1' рисует 1, то что мешает дописать код чтоб на 1 рисовала 1?, а потом на 10 рисовала 1и рядом 0?
Экран то какой? На все ходовые уже давно всё поделали, и на русском и не на русском.
Только никому больше не говорите про отличие Ардуино от С++.
Поздно, я уже заметил :-)
Не могли бы вы разъяснить как метод .print понимает, что получил, строку и в какой кодировке, целое или вещественное число? В С++, если я правильно понимаю, что описано в прототипе, с тем функция и работает. Судя по всему, Arduino построена иначе.
давайте по порядку.
До того мы говорили про метод Display() , прототип которого вы приводили в сообщении #8. Теперь вдруг речь зашла про какой-то метод print, непонятно откуда взявшийся.
Так какой метод надо рассмотреть - метод print или метод прототип которого вы приводили выше?
Библиотека, которую я пытаюсь понять взята отсюда:
https://github.com/luetee/ST7567S_128X64_I2C
Как по вашему мнению, она допилена или нет?
Вот в этом коне-библиотеке ищите свой экранчик. Она явно допилена-перепилена.
<U8g2lib.h>
У меня похожий экранчик, уже не помню как, но на русском шпрехает. Вот мой рабочий пример.
Так какой метод надо рассмотреть - метод print или метод прототип которого вы приводили выше?
Извините. Моя ошибка. Интересует метод print и всё, что с ним связано. Т.е. каким образом библиотека понимает, что передаётся. Например:
Сначала печатаем строку, затем число, полученное с аналогового входа. Как метод print понимает, что именно ему передали?
все, тушите свет.
Как метод print понимает, что именно ему передали?
прочитайте что-нибудь про перегрузку функций в Си. Именно в Си, а не в ардуино.
Вы же утверждали, что понимаете, как работают функции в Си...
Сначала печатаем строку, затем число, полученное с аналогового входа. Как метод print понимает, что именно ему передали?
Должен понимать компилятор - он умнее.
Похоже что ТС опять пропал. То ли осознал дремучесть своих вопросов, то ли готовит новую порцию :)
прочитайте что-нибудь про перегрузку функций в Си. Именно в Си, а не в ардуино.
Вы же утверждали, что понимаете, как работают функции в Си...
Перегруженный функции это набор функций, принимающих разные типы параметров. Посмотрел вышеуказанную библиотеку. Есть объявление класса, в который входит набор методов. Если компилятор выбирает из набора функций, имеющих одно название, ту, которая сможет работать с передаваемым типом, то не понятно, как компилятор выбирает метод, из набора с разными именами? Подозреваю, что где-то тут "собака порылась".
компилятор не выбирает метод, метод выбираешь ты. Компилятор подставляет тот, который более всего подходит по параметрам.
P.S. Метод = функция класса
Перегружаемые функции имеют одинаковое имя, но разное количество или типы аргументов. Это разновидность статического полиморфизма, при которой вопрос о том, какую из функций вызвать, решается по списку её аргументов.
ТС, я думал вы экран хотите запустить, а не в понимашки играть. Вот первый же ответ для людей далёких от программирования и языков этих птичьих, но понятный. Что не ясно?, по "внешнему" виду аргументов!!!, не по имени.
В библиотеке стандартных функций Ардуино (называется wiring) НЕ ОДИН print, а МНОГО:
Во время компиляции gcc видит с каким параметром написан вызов и использует максимально похожий метод, если подберет. Для понимания нужно зарубить на носу, ЧТО ВСЁ ЭТО - РАЗНЫЕ ФУНКЦИИ!!! Тип параметра - как-бы часть имени метода, понял?