Pull to refresh

Comments 71

Занятная IT археология. Схожая история повлияла на порядок кириллических символов в КОИ-8. Символы располагаются в соответствии с фонетической схожестью с латинскими символами в первой половине таблицы. Таким образом, если текст попадет в 7битное окружение, то он останется в некоторой степени читаемым. Пример из википедии: слова «Русский Текст» превратятся в «rUSSKIJ tEKST». Только остается загадкой для меня почему регистр инвертировали…

Регистр инвертировали, потому что, отбросив старший бит в КОИ-8, получаем КОИ-7, состоящую из больших английских и больших русских букв (наиболее широко распространённую кодировку русского языка с конца 70-х до конца 80-х).

Слова «Русский Текст» в КОИ-8 превратятся после отбрасывания старшего бита в «РUSSKIJ ТEKST» в КОИ-7, а слова «РУССКИЙ ТЕКСТ» в КОИ-8 – в «РУССКИЙ ТЕКСТ» в КОИ-7. А 7-битная кодировка ASCII с большими и маленькими латинскими буквами не применялась на оборудовании, использовавшемся в СССР, поэтому «rUSSKIJ tEKST» неактуален.

Вообще-то, в КОИ-7 три таблицы символов: Н0, Н1 и Н2:


  • Первая — суть копия ASCII.
  • Третья, Н2 — суть Н0 с заменой строчных латинских на прописные кириллические. То есть латиница и кириллица и только прописными.
  • Таблица Н1 же суть Н2 с заменой латинских прописных на строчные кириллические.

В советское время производились микросхемы масочного ПЗУ знакогенератора для каждой из трёх таблиц. Системы попроще-подешевле использовали только Н2, системы подороже Н0 + Н1 с переключением страниц. Одни умели это делать автоматически (хранение бита в экранном буфере, плюс SI/SO для переключения при кодировании), в других нужно было тумблер вручную переключать (либо всё латиницей, либо всё кириллицей — любительский Радио-86РК, как пример).


P.S. Для меня загадка, почему КОИ-7, совместимая с ISO 646, не стала стандартом вместо несовместимой КОИ-8 с сопутствующими проблемами из-за графических символов в наборе C1.

Запомнилась история из школы, видимо как раз связанная с этими несколькими таблицами. Изучали паскаль на каких-то БК. У товарища что-то глюкануло, и на экране после набора программы получилось «програм гуси; жар и: интегер; бегин...». Насколько я помню, оно компилировалось и работало — глюканул только знакогенератор, видимо.
:)

А КОИ-8 де-факто никогда не была стандартом. Сначала почти повсюду использовалась КОИ-7, а потом распространились PC с альтернативной кодировкой ГОСТ, на основе которой впоследствии была внедрена CP866.

КОИ-8 была de facto стандартом на UNIX и клонах. Зафиксировано как RFC 1489:


Though the proposed character set "koi8-r" is not currently an international standard, there is very large user community (including Relcom Net) supporting it. Factually, "koi8-r" is de-facto standard for Unix and global network applications in the former Soviet Union. This is the reason the Society of Unix User Groups (SUUG) believes "koi8-r" should be registered.

Другими словами, был ещё мир за пределами PC и и на PC за пределами PC/MS-DOS, MS Windows и даже OS/2.

Unix тогда был распространён меньше, чем сейчас, и даже там КОИ8 использовалась не во всех реализациях.

КОИ-7, как правило.

Зато в Linux двадцать лет назад почти все использовали либо koi8-r, либо koi8-u.


Преимуществ против КОИ-7 практически нет никаких:


  • Для псевдографики всё равно использовали переключение на DEC таблицу, появившуюся в VT100, а не символы из окна C1 в КОИ-8.
  • Текст на смешанном кириллическо-латинском тексте будет в КОИ-7 чуть больше за счёт одного символа SI или SO на границе кириллического и латинского текста.

Зато минус ощущали все из-за огромного количества ПО, ожидавшего в C1 управляющих кодов согласно ISO 646.

Ох уж эти стандарты доUTFовских времён…
Википедия пишет: «Была широко распространена как основная русская кодировка в Unix-совместимых ОС и в электронной почте»

Про электронную почту вопрос крайне спорный, так как основной русскоязычный трафик в то время шёл через фидо, в кодировке 866.

Как поддерживавший почтовые UUCP/SMTP сервера с первой половины 90-х, могу сказать, что koi8-r была стандартом. Если кодировка не была указана явно, то подразумевалась koi8-r. Зарубежные писатели почтовых программ были далеки от наших реалий и отправляли письма либо в 1251, либо в 866-й без указания кодировок, что и приводило ко всяческой бНОПНе.
В системе UUCP/SMTP (условно говоря, в релкоме) koi8-r, действительно, была стандартом.

Но я к тому, что электронная почта в то время не исчерпывалась UUCP.
Н0 + Н1 с переключением страниц. Одни умели это делать автоматически (хранение бита в экранном буфере, плюс SI/SO для переключения при кодировании)

Помню компилятор Паскаля на ДВК, который букву щ воспринимал, как конец комментария, так как она имела одинаковый код с правой фигурной скобкой.
А если погрузиться ещё глубже в эту ветвь археологиии, то можно обнаружить, что КОИ-7 — появился на свет под влиянием телеграфного 5-битного кода МТК-2 (в котором было 3 регистра — для латинских букв; для русских букв; для цифр)
И в МТК-2 — совпадали коды латинские и русские буквы (каждая — на своем регистре). Если не переключить регистр — текст оставался читабельным, как сейчас говорится TRANSLITERACIEY :)
А эта идеология пришла в МТК-2 из русской версии азбуки Морзе, принятой в 1856 году :)
На машинах DEC серии PDP-11 использовалась ещё занятная кодировка Radix-50, позволявшая хранить три алфавитно-цифровых символа в 16 битах.
> сейчас вряд ли кто-нибудь использует кодировку, первые 128 символов которой отличались бы от ASCII

Порадовали :) Погуглите «mastercard ebcdic» или «amex ebcdic»…
да, сейчас на проекте в банке для штатов, так там есть ещё чудный формат X9, который помимо прочих радостей ещё и использует EBCDIC
Еще история вспомнилась — как-то я реализацию BASE64 отлаживал на VisalC++ 98. Для теста в код была впендюрена строковая константа, что-то вроде
const char s[] = "DJKFHGKJHGJ242423?==";
Не сходится — хоть ты тресни. Потом в отладчике случайно замечаю, что константа то у меня «DJKFHGKJHGJ242423#» — я чуть умом не тронулся :) Как гуглить "?==" тоже непонятно. Спасло, что под рукой оказался gcc — он выдал варнинг «trigraphs are not supported». Эта дрянь именно из EBCDIC'ов и вылезла, где не было #, {} и еще всякого. Т.е. ?==include <something.h> — корректный код :)

Это просто свойство ранних терминалов, телетайпного типа. В EBCDIC эти символы есть.


Самая главная проблема с EBCDIC была в том, что в нём имелся символ отрицания ¬, отсутствовавший в ASCII.


А также в том, что в русской локализации — ДКОИ — придумали не делать для русских букв, сходных с латинскими, отдельных кодов. А поскольку сходство букв отличается для прописных и строчных, это приводило к тому, что для текста в ДКОИ невозможно было однозначно сделать upcase и lowcase: русский -> PYCCKИЙ -> pуcckий.

Нет, не было. Пруф: www.columbia.edu/cu/computinghistory/029.html



Потом на основании EBCDIC создали 100500 разных кодировок, где в свободные позиции напихали кто что хотел — кто фигурные скобки, кто кириллицу, кто знаки валют кроме цента и доллара…

Это просто так работал конкретный перфоратор. Были подобные же ограниченные устройства и в ASCII. Кодовую страницу 37 (EBCDIC) можно посмотреть в справочнике, там всё есть.


В частности, в кодировке КОИ7 (набор 2, если угодно) вообще нет фигурных скобок.

Это просто так работал конкретный перфоратор.

Текст по ссылке прочитайте, а не только на картинку смотрите.

можно посмотреть в справочнике, там всё есть.

Да пожалуйста:



Взято отсюда.

Вы почувствуйте разницу между кодировкой EBCDIC и представлением символов EBCDIC в устройствах S/360.


И уж явно триграфы в языке Си появились не из-за S/360, которая к моменту реализации Си была снята с производства.

Ну конечно, вам ведь виднее, какие символы были в EBCDIC, чем фирме IBM, которая эту кодировку создала и использовала в своих компьютерах.
На секундочку, вы не привели ни одной ссылки на мнение IBM, только какие-то публикации третьих лиц из университетов. Хотите знать мнение IBM – откройте, например, страницу 288 IBM System/370 Principles of Operation. Более официального документа относительно мейнфреймов IBM тех лет, когда появились триграфы в Си – не существует.

При этом заметим, что, например, на небезызвестном компьютере Apple ][ базовой модели 1977 года, который к EBCDIC не имеет отношения ну никаким боком – не было фигурных скобок. Они появились только на Apple ][+ вместе со строчными буквами.
А не удобней в кодировке хранить строчные/заглавные попарно: аАбБ и т.д. (одни чётные, другие нечётные, вроде как, бывают комманды процессора проверяющие чётность, да и перевод регистра не зависил бы от длинны алфавита), может, тогда бы и галочка «без учёта регистра» не была бы нужна, хотя, регистр — учитывался бы?
Исторически возникали кодировки сначала только с большими буквами, а потом уже к ним добавляли маленькие.
У ASCII не было предшественника только с большими буквами, так что там могли бы.
Сам ASCII поначалу включал только большие буквы. Это позволяло использовать 6-разрядный знакогенератор, в который записывались символы с кодами от 20 до 5F.
Да, действительно, маленькие буквы добавили в 1967.
Это телеграфно-телетайпное легаси. С пяти-разрядным «знакокогенератором»,
и JCUKEN раскладкой. Когда начали приходить первые PC, например, Правец, скорбь тех, кто привык к JCUKEN была непереносима.
Вспомнил вот эту историю:

По бокам космического корабля «Кеннеди» размещаются два двигателя по 5 футов шириной. Конструкторы корабля хотели бы сделать эти двигатели еще шире, но не смогли. Почему? Дело в том, что двигатели эти доставлялись по железной дороге, которая проходит по узкому туннелю. Расстояние между рельсами стандартное: 4 фута 8.5 дюйма, поэтому конструкторы могли сделать двигатели только шириной 5 футов. Возникает вопрос: почему расстояние между рельсами 4 фута 8.5 дюйма? Откуда взялась эта цифра? Оказывается, что железную дорогу в Штатах делали такую же, как и в Англии, а в Англии делали железнодорожные вагоны по тому же принципу, что и трамвайные, а первые трамваи производились в Англии по образу и подобию конки. А длина оси конки составляла как раз 4 фута 8.5 дюйма! Но почему? Потому что конки делали с тем расчетом, чтобы их оси попадали в колеи на английских дорогах, чтобы колеса меньше изнашивались, а расстояние между колеями в Англии как раз 4 фута 8.5 дюйма! Отчего так? Да просто дороги в Великобритании стали делать римляне, подводя их под размер своих боевых колесниц, и длина оси стандартной римской колесницы равнялась… правильно, 4 футам 8.5 дюймам! Ну вот теперь мы докопались, откуда взялся этот размер, но все же почему римлянам вздумалось делать свои колесницы с осями именно такой длины? А вот почему: в такую колесницу запрягали обычно двух лошадей. А 4 фута 8.5 дюйма — это был как раз размер двух лошадиных задниц! Делать ось колесницы длиннее было неудобно, так как это нарушало бы равновесие колесницы. Следовательно, вот и ответ на самый первый вопрос: даже теперь, когда человек вышел в космос, его наивысшие технические достижения напрямую зависят от РАЗМЕРА ЛОШАДИНОЙ ЗАДНИЦЫ.
Разбирали в т.ч. на Пикабу, что там по фактической ошибке в каждой строчке, хотя мораль в целом верная.
Ну, наверное. Но интересно то, что в IT очень много где торчат вполне реальные «лошадиные задницы», начиная с уже тут упомянутых раскладки клавиатуры и расположения клавиш друг над другом со смещением.
На Восточном с тоннелями тоже нынче проблем много
Вообще, что является самым старым легаси в ИТ, расположение клавиш на клавиатуре, учитывающее наличие механических рычагов под клавишами?
Тогда уж сам по себе латинский алфавит.
Система счисления времени в часах и минутах, доставшаяся нам от римлян.
От шумеров. Видимая величина солнца — полградуса, поэтому в видимой области неба помещалось 360 солнц. Отсюда и 60-ричная система.

Это работало бы лишь для плоской земли, а она сильно не ровная. Тут скорее дело в том, что 60 удобно делить на двоих, троих, четверых, пятерых и шестерых.

Думаю, что вы оба правы, и видимую величину солнца (по данным Википедии, она изменяется от 31′31″ до 32′36″, т.е. от 1/331 до 1/343 горизонта) округлили до 1/360 для удобства деления.
Еще примерно 360 дней в году
Если что, это urban legend, что будто бы клавиши расставили из-за сцепления рычагов. В русской википедии это написано с пометкой "[источник не указан 2440 дней]", в английской отсутствует.
В английской на самом деле написано:
James Densmore had suggested splitting up commonly used letter combinations in order to solve a jamming problem caused by the slow method of recovering from a keystroke: weights, not springs, returned all parts to the «rest» position. This concept was later refined by Sholes and the resulting QWERTY layout is still used today
Угу, и тоже без ссылки на источник =)

Сочетания букв E+R, E+S, E+D, A+S, и в том и в другом порядке, — среди самых частых в английском; тем не менее им соответствуют рядом стоящие клавиши.
Возможно, указанная идея по разделению просто не была реализована в полной мере? Как минимум, мы имеем два факта: джамминг имел место быть (кстати, в русской википедии лично я вижу именно ссылку на это в работе Е. И. Дмитриевской), а значительное количество из часто встречающихся сочетаний в qwerty таки разнесены.
По сравнению с алфавитной раскладкой, применявшейся до перестановки клавиш, стало только хуже: там часто встречаемых сочетаний было лишь три (D+E, N+O, S+T). Следовательно, целью перестановки не могло быть разнесение часто встречающихся сочетаний.
Насколько я вижу, вы в своих рассуждениях почему-то не учитываете близость в разных рядах. В первой печатной машинке Шоулза рядом также были, например A+N, E+S, H+I. И, полагаю, «разнесение часто встречающихся сочетаний» (тем более при далеко не полном анализе) и «минимизация случаев сцепления рычагов» (в том числе с учетом замечания ниже) — все же не идентичные задачи, хотя и связанные.
Рядом стоящие клавиши не обязательно ведут к рядом стоящим литерам, у меня на машинке там сложнее устроено всё.

Имею ввиду не раскладку, а смещение рядов клавиш, полностью соответствующее механической пишмашинке, где клавиши расположены на продольных рычагах, жёстко задающих взаиморасположение рядов.

Вся эта хрень напоминает старую байку про ракеты и лошадиные задницы. Но если там довольно притянтая за уши история, то тут прямо видно эволюцию легаси.


Блин… меня опередили=) За что люблю мой хабр, так это за то, что дофига людей тут думает так же как я, но все равно есть что почерпнуть. От такого мылительного эха порой даже неловко.

Правильно ли я понимаю, что pre-EBCDIC-кодировки невозможно использовать в C из-за совпадения '\0' c '0' или ' '? А вот EBCDIC в теории можно ( leetcode.com/problems/rotate-string — тут не оговорена кодировка).
Очень интересный вопрос, потому что Си разрабатывался для и на PDP-11, а там использовалась уже упомянутая кодировка RADIX-50, в которой нулевой код соответствовал пробелу.
Some strings in DEC's 16-bit systems were encoded as 8-bit bytes, while others used RADIX 50 (then also called MOD40).

Видимо, RADIX-50 использовалась ограниченно и только для строк. К тому же, возникает проблема отсутствия некоторых символов, особенно '?', присутствующего в en.wikipedia.org/wiki/ISO/IEC_646. Особенно забавно, что IBM со своими кодировками успешно опротестовала исключение триграфов из C++11.

P.S. выше я имел в виду эту задачу: www.hackerrank.com/challenges/caesar-cipher-1/problem. С учётом, что IBM всё ещё держится за наследие, уточнить кодировку на собеседовании таки становится очень важно.
Насколько я помню RADIX-50 использовался довольно ограничено для хранения имен файлов в RT-11 и RSX-11. Внутри текстовых файлов был ASCII.
Формально это так, но на самом деле тут вопрос в том, что в pre-EBCDIC и pre-ASCII времена ещё не была изобретена байтовая адресация памяти (это одно из нововведений IBM S/360), поэтому си-строки в любом случае не могли быть нативно реализованы на тех машинах. Например, на БЭСМ-6 и ранних машинах CDC строка символов представляла собой массив из 8 символов в 6-разрядной кодировке, и никак иначе, потому что это было просто-напросто 48-разрядное слово.

Рудиментом такого положения дел являлся строковый тип ALFA в оригинальном виртовском компиляторе Паскаля (появившемся ещё до Си), который номинально определён как упакованный массив символов фиксированной длины.

Короче, в своё время побоялись сделать рефакторинг. Так что до сих пор расхлёбываем.

История кодировок начинается задолго до появления компьютеров.

Как раз на днях разбирался почему Ж сопоставили V в кодировках и раскопал приказ 28940 от 1855 года Николая I, по которому телеграфисты сначала сделали свою азбуку Морзе, в которой не было соответствия с латинскими буквами.



Но она не зашла, так как уже привыкли транслитом слать депеши и в 1856 Александр II утвердил уже существующее положение дел.

Эта таблица и попала дальше в КОИ и в EBCDIC.

В то давнее время даже ещё не было часовых поясов и время по телеграфным станциям отличалось на конкретные секунды, а не на ровное количество часов.



Вот такую первую сетку Сименес протянул по просторам России. Сисадмин :)
А все эти приказы похожи прям на древние RFC, интересно почитать.
Как раз на днях разбирался почему Ж сопоставили V в кодировках и раскопал приказ 28940 от 1855 года Николая I, по которому телеграфисты сначала сделали свою азбуку Морзе, в которой не было соответствия с латинскими буквами.

Но она не зашла, так как уже привыкли транслитом слать депеши и в 1856 Александр II утвердил уже существующее положение дел.

Эта таблица и попала дальше в КОИ и в EBCDIC.

Это очень интересно (в частности то, что латинским алфавитом тогда считался немецкий), но так и не объясняет V=Ж в КОИ
Это объясняет, что V=Ж в КОИ пришло из уже сложившейся практики передачи через Морзе русских текстов.
Например могу предположить, что это произошло не без влияния буквы Ѵ Ижица, но это уже никто не раскопает, так как скорее всего это сложилось спонтанно при первых опытах передачи кириллических сообщений через телеграф и задокументировалось, только уже по факту в приказе.
Продолжу нелепости. :)
Играя с сыном в апоЖ, заметил, что Я и I буквы палиндромы.

TL;DR потому что BCD означает двоично-десятичный, и текущая версия ведет род от кодировки в перфокартах. Но вот детали, как именно это всё было, радуют, и это хорошо.

Да, возможно стоило добавить абзац про двоично-десятичные числа :)
Это представление, когда каждой десятичной цифре отведены фиксированные биты, например число 1234 может храниться как 0x1234.
BCDIC создавалась так, чтобы двоично-десятичное представление числа совпадало с его строковой записью — для этого ноль и «поставили на место». Но BCD не имеет отношения к кодировке букв, и их оставили «как есть».
EBCDIC уже не имеет к BCD никакого отношения, кроме исторической связи.
Sign up to leave a comment.

Articles