«Виселица»: правлю баги

Игрушка «Виселица» для «Флиппера Зеро», которую мы как-то написали с дочкой, давно перешла из стадии весёлой разработки в стадию унылой поддержки — пользователи потихоньку находят баги, я правлю. Не самая моя любимая стадия, но один баг повеселил.

Один из пользователей пожаловался, что слова с русской буквой «Р» отображаются иногда как-то неадекватно — крайние буквы как будто «срезаются». Выкинув из словаря всё, кроме слов, начинающихся или кончающихся на эту букву, я и сам убедился в наличии этого странного эффекта.

Проблема оказалось в сочетании того как я кодирую символы русских слов и следующей строки кода:

furi_string_trim(line);

Для экономии места и производительности словарь у меня хранится в кодировке UCS-2 с выкинутыми кодами 0x04, из-за чего русская буква «Р» (с кодом 0x0420) записывается как 0x20, а это код пробела.

Вызов furi_string_trim мне нужен, чтобы срезать перевод строки, после её считывания. Только я не учёл, что срезаются там все пробельные символы, включая урезанную до одного байта букву «Р».

В общем, создал себе проблем на ровном месте. Надо было хранить буквы как есть и не выпендриваться. Впрочем, баг правится просто:

furi_string_trim(line, "\n");

Комментарии 6

SiMMmr E16/NR04δ13 № 1
если уж экономить — то по хардкорному — 5 бит достаточно для кириллицы, если не рассматривать более низкопроизводительные коды переменной длины 😀
Евгений Степанищев автор № 2
Я сейчас рассчитываю, что могу подключить любой язык в пределах ucs-2)
SiMMmr E16/NR04δ13 № 3
посчитать количество бит для кодирования символа вряд ли является проблемой 🤷‍♂️
/all/pilyu-viselicu

Евгений Степанищев автор № 4
Аккумулятор мне дороже места)