Требуется обновление браузера.

Вишниво-лаймовый краш


Просмотров: 313
26 ноября 2023 года
Сегодня я поведаю вам очередную историю о том, как причудливо влияют сегодняшние решения на далекое будущее.

Экспозиция


Случилось так, что в минувший октябрь я, с группой уважаемых людей, посетил кинотеатр. Так как сеанс был нестандартно долгим, для возвращения в реальность (да и - времени с обеда прошло немало) мы решили посетить рядом расположенный пункт питания. Всё было отлично: собравшиеся делились впечатлениями от киноленты, официант оперативно принёс заказ. Но вот, нам принесли чек. Кто-то обратил внимание на досадную опечатку в описании позиции: «ВИШНиВО» (sic!).

Ad hoc анализ


Вернулся к ситуации (в виду приоритетов) я две недели спустя.

Вообще, странно, что кто-то не только бы промазал мимо нужной клавиши, но и переключил туда-сюда регистр. Больше похоже на проблемы с кодировкой. Набрасываю (прямо на телефоне) простенький код на Python, с наудачу отобранными кодовыми страницами CP1251 и CP866 для ASCII.

code_py.png
Что-нибудь для прототипирования всегда должно быть под рукой

То есть симулирую ситуацию: закодированное в 1251 читается по правилам 866. И действительно: «Ё» превратилась в «и». Правда, остальные символы превратились в кракозябры:

run_py.png
Результат выполнения

Значит, ситуация чуть сложнее: используется не совсем верный алгоритм трансляции. Вспоминаю, что в универе «ходил по рукам» алгоритм (реализация для Си/плюсов) для «поддержки кириллицы в терминале». Нахожу его, смотрю соответствие кодов для CP1251 и CP866, дописываю два условия, включаемые по флагу:

Студенческий алгоритм трансляции с доработкой
12345678910111213141516171819202122232425262728293031323334
#include <iostream>

using namespace std;

void rus(const char* translit, bool bugfix);

int main()
{
    const char* text = "ВИШНЁВО-ЛАЙМОВЫЙ КРАШ";
    rus(text, false);
    cout << endl;
    rus(text, true);
    return 0;
}

void rus(const char* translit, bool bugfix)
{
    int i = 0;
    while (translit[i] != 0)
    {
        unsigned char let = translit[i];
        unsigned char rus = let;
        if(let >= 192 && let <= 239 ) rus -= 64;
        if(let >= 240 && let <= 255 ) rus -= 16;

        if (bugfix){
            if(let == 168) rus = 240;
            if(let == 184) rus = 241;
        }

        cout << rus;
        i++;
    }
}

Проверяю два варианта алгоритма на целевой строке из чека:

output.png
Результат выполнения

Таким образом, где-то в цепочке «база ресторана - кассовый терминал» есть популярный неполный алгоритм перекодирования.

Погружение в историю


outro_codepages.jpg
Репринт той самой статьи
Внимательное чтение Википедии, наталкивает нас на статью аж 1986 года. В этой статье, члены экспертной комиссии (выбор кодовой страницы) аргументируют предложение вынести буквы «Ё» и «ё» за пределы основной упорядоченной части.

На мой взгляд: аргументация слабая, необоснованно (в рамках этой же статьи) завязана на актуальные технические решения и сквозит пренебрежением к замечательной букве «Ё».

Запись опубликована в категориях:

Отладка IRL Scrupulosus Алгоритмы и аспекты  
 

Комментарии

Инкогнито
  Загружаем captcha