Вишниво-лаймовый краш
Просмотров: 492
26 ноября 2023 года
Сегодня я поведаю вам очередную историю о том, как причудливо влияют сегодняшние решения на далекое будущее.
Случилось так, что в минувший октябрь я, с группой уважаемых людей, посетил кинотеатр. Так как сеанс был нестандартно долгим, для возвращения в реальность (да и - времени с обеда прошло немало) мы решили посетить рядом расположенный пункт питания. Всё было отлично: собравшиеся делились впечатлениями от киноленты, официант оперативно принёс заказ. Но вот, нам принесли чек. Кто-то обратил внимание на досадную опечатку в описании позиции: «ВИШНиВО» (sic!).
Вернулся к ситуации (в виду приоритетов) я две недели спустя.
Вообще, странно, что кто-то не только бы промазал мимо нужной клавиши, но и переключил туда-сюда регистр. Больше похоже на проблемы с кодировкой. Набрасываю (прямо на телефоне) простенький код на Python, с наудачу отобранными кодовыми страницами CP1251 и CP866 для ASCII.
То есть симулирую ситуацию: закодированное в 1251 читается по правилам 866. И действительно: «Ё» превратилась в «и». Правда, остальные символы превратились в кракозябры:
Значит, ситуация чуть сложнее: используется не совсем верный алгоритм трансляции. Вспоминаю, что в универе «ходил по рукам» алгоритм (реализация для Си/плюсов) для «поддержки кириллицы в терминале». Нахожу его, смотрю соответствие кодов для CP1251 и CP866, дописываю два условия, включаемые по флагу:
Проверяю два варианта алгоритма на целевой строке из чека:
Таким образом, где-то в цепочке «база ресторана - кассовый терминал» есть популярный неполный алгоритм перекодирования.
Внимательное чтение Википедии, наталкивает нас на статью аж 1986 года. В этой статье, члены экспертной комиссии (выбор кодовой страницы) аргументируют предложение вынести буквы «Ё» и «ё» за пределы основной упорядоченной части.
На мой взгляд: аргументация слабая, необоснованно (в рамках этой же статьи) завязана на актуальные технические решения и сквозит пренебрежением к замечательной букве «Ё».
Экспозиция
Случилось так, что в минувший октябрь я, с группой уважаемых людей, посетил кинотеатр. Так как сеанс был нестандартно долгим, для возвращения в реальность (да и - времени с обеда прошло немало) мы решили посетить рядом расположенный пункт питания. Всё было отлично: собравшиеся делились впечатлениями от киноленты, официант оперативно принёс заказ. Но вот, нам принесли чек. Кто-то обратил внимание на досадную опечатку в описании позиции: «ВИШНиВО» (sic!).
Ad hoc анализ
Вернулся к ситуации (в виду приоритетов) я две недели спустя.
Вообще, странно, что кто-то не только бы промазал мимо нужной клавиши, но и переключил туда-сюда регистр. Больше похоже на проблемы с кодировкой. Набрасываю (прямо на телефоне) простенький код на Python, с наудачу отобранными кодовыми страницами CP1251 и CP866 для ASCII.
То есть симулирую ситуацию: закодированное в 1251 читается по правилам 866. И действительно: «Ё» превратилась в «и». Правда, остальные символы превратились в кракозябры:
Значит, ситуация чуть сложнее: используется не совсем верный алгоритм трансляции. Вспоминаю, что в универе «ходил по рукам» алгоритм (реализация для Си/плюсов) для «поддержки кириллицы в терминале». Нахожу его, смотрю соответствие кодов для 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++; } } |
Проверяю два варианта алгоритма на целевой строке из чека:
Таким образом, где-то в цепочке «база ресторана - кассовый терминал» есть популярный неполный алгоритм перекодирования.
Погружение в историю
Внимательное чтение Википедии, наталкивает нас на статью аж 1986 года. В этой статье, члены экспертной комиссии (выбор кодовой страницы) аргументируют предложение вынести буквы «Ё» и «ё» за пределы основной упорядоченной части.
На мой взгляд: аргументация слабая, необоснованно (в рамках этой же статьи) завязана на актуальные технические решения и сквозит пренебрежением к замечательной букве «Ё».
Комментарии