Задать вопрос
@Aztart

Как создать и использовать свою кодировку знаков?

Образовательный интерес.
Как создать и установить в систему Windows/Linux ASCII-расширеную или любую другую кодировку, в каком виде это вообще представляется, на каком языке пишется.
С чего лучше начать, какие книги или статьи есть об этом?
  • Вопрос задан
  • 682 просмотра
Подписаться 1 Простой 23 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    1C-программист: расширенный курс
    18 месяцев
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
  • ProductStar × РБК
    Профессия DevOps-инженер + ИИ
    5 месяцев
    Далее
Решения вопроса 4
Daemon23RUS
@Daemon23RUS
Образовательный интерес.

Кодировка - сама по себе особо то и не пишется, вот взбрело Вам в голову изобрести свою кодировку - изобретайте. Например решили будет 8 бит на это. Предположим Вы начали 0- пробел, 1- A, 2 - Б .... итд. Ограничено лишь Вашей фантазией, я в качестве примера привел русский, но это может быть к примеру трольий,
пусть так и будет. Опустим момент с клавиатурой. Будем только документы смотреть. Заполнили вы таблицу соответствия отображаемым символам. Теперь у Вас есть кодировка. Назовите, как угодно Вы теперь можете составлять (нужна клавиатура) и смотреть (нужны шрифты) трольи документы в созданной кодировке. Это условно, следующий момент программа просмотра/редактирования. Но и на этом этапе уже можно утверждать что Вы создали кодировку. Как хранятся ваши фалы - как байты; без метаданных о кодировке.
Отображение - только при правильной интерпретации (через iconv или редактор) (на примере Ubuntu)
Шрифты Выбираются по Unicode-кодам после декодирования (Тут тоже момент про глифы, они должны быть, если символ уникален)
Следующий этап - внедрить ее в ОС.
Нужна тролья локаль (тут почитайте погуглите как и что устроено)
Но один из компонентов явно связан, это LC_CTYPE (Какие байты считаются буквами. Как переводить в верхний/нижний регистр. Какие символы — пробелы, цифры и т.д.) и LC_COLLATE (Правила сортировки строк)
Остается iconv. Для него потребуется написать модуль для glibc (модуль преобразования (.so-файл) )

Все у Вас теперь своя тролья кодировка.
Это обобщенное описание, не претендующее на истину в первой инстанции, но поможет Вам понять принцип. Ну и отсутствие практической пользы, только как академический интерес. Да и вопрос наверно должен звучать "как подружить экзотическую кодировку с ОС" и для каждой ОС будут свои методы.
Ответ написан
@rPman
Создание кодировки в windows не доступно пользователям, обслуживается полностью компанией майкрософт.

Есть документация в msdn по использованию, т.е. можно попытаться отреверсить, какие файлы и какие ключи реестра нужно добавить, что бы приложения хотя бы попытались это использовать.

Само собой, приложения так же должны понимать эту кодировку.

p.s. можно выбрать для себя range в unicode и пользоваться, для этого есть https://en.wikipedia.org/wiki/Universal_Character_...
Ответ написан
@ImagineTables
Как создать и использовать свою кодировку знаков?


1. Придумайте хорошую кодировку
2. Убедите вашу целевую группу (весь мир?) её использовать.

Каков вопрос — таков ответ.

Могу дать совет по первому пункту. В Юникоде даже т.н. «фиксированные» кодировки фиксированы только по кодепоинтам, но НЕ по символам. Фактически, это затачивает Юникод под UTF-8, потому что нафига кому-то нужен UTF-32, если всё равно нельзя одним смещением в буфере получить адрес i-того символа. Исправьте это, оставив достоинства Юникода, и я серьёзно задумаюсь о переходе на вашу кодировку.

Как создать и установить в систему Windows/Linux ASCII-расширеную или любую другую кодировку


Вы исходите из того, что понятие «кодировка» универсальным образом абстрагировано в ОС. А это не так.

В API винды функции, работающие со строками, дублированы с двумя суффиксами: A и W. Например, SetTextA(hWnd, buffer) будет считать, что buffer содержит текст в одной жёстко заданной кодировке, а SetTextW(hWnd, buffer) будет считать, что buffer содержит текст в другой жёстко заданной кодировке. Таким образом, используемые СИСТЕМОЙ кодировки ограничены двумя заданными. Чтобы добавить свою кодировку, винда должна была быть устроена так:

HENCODING hEncoding = CreateEncoding(…тут колбэк или описание кодировки на декларативном языке…);
auto buffer = …тут текст в вашей кодировке…;
SetText(hWnd, hEncoding, buffer);


Но это астронавтика. Поэтому добавить кодировки в СИСТЕМУ уже нельзя, а можно только на уровне приложений.

Если нужно что-то типа схем трансляции NLS, которые в винде представлены в реестре, лучше написать конкретику.
Ответ написан
Комментировать
VoidVolker
@VoidVolker
Dark side eye. А у нас печеньки! А у вас?
Вопрос в том, как создать с ноля кодировку и установить её в систему, чтобы при создании текстового файла и при выборе кодировки, в которой этот файл будет представляться, в перечне присутствовала эта кодировка и отображала в тексте её знаки.

На самом деле тут четыре задачи:
  1. Создать саму кодировку
  2. Создать файл описания кодировки в соответствующем формате — это и есть кодовая страница
  3. Создать шрифт для этой кодировки — для отображения символов
  4. Локализация клавиатуры — размещение ваших символов на клавиатуре

В целом всё достаточно просто — надо только разобраться как оно всё работает. Третий и четвёртый пункты нужны если у вас свой или нестандартный алфавит. Всё нижеследующее — для винды, как оно делается в линуксе я не знаю, но скорее всего что-то похожее (можно начать отсюда).

    Создать саму кодировку достаточно просто: в общем случае просто нумеруете каждый символ и ваша кодировка готова. В ОС Windows традиционно существует два основных вида кодировок: одно-байтовые и двух-байтовые. Соответственно, до 256 символов в первом случае и до 65535 символов во втором. Системное API поддерживает два вида кодировок: с суффиксом "A" (ANSI) и "W" (wide, Unicode-16). Так же существуют и другие виды кодировок: в половину байта — т.е. 7 бит, размером в 4 байта — юникод-32, есть даже гибридные, в которых символы могут занимать как один байт, так и больше. Это сегодняшний международный стандарт: utf-8.

    Теперь вам нужно сообщить системе, что есть такая кодировка. Деталей формата не знаю и как оно в целом работает тоже — просто быстро поглядел документацию. Так что тут вам предстоит самостоятельно выяснить все детали. Советую начать с официальной документации. Файлы кодировок хранятся по следующему пути: %windir%\System32\c_XXXX.nls. в формате nls и в виде списка в реестре по пути HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage. Возможно что-то ещё потребуется. Вот тут вроде как есть редактор для кодовых страниц со всеми инструкциями: http://www.barrcentral.com/Help/Beps — но судя по всему редактор там идёт вместе со всем пакетом данного софта, т.к. на странице загрузок его нет отдельно, только весь пакет.
    Для стандартного алфавита этого уже достаточно и должно всё работать. В теории, конечно же. Как будет на практике — тут надо выяснять, что надо сделать ещё и где настроить. Например, для консольных и оконных приложений оно может работать по-разному.

    Для отображения символов какого-то нового алфавита вам потребуется шрифт. В целом шрифт создать очень просто: редакторов шрифтов полно. Шрифт по сути это список из двух пар: число и картинка символа. Есть два основных вид шрифтов: пиксельные и векторные. Пиксельные — это обычные картинки из стандартных пикселей для каждого размера символов. А вот векторные шрифты универсальны для всех размером: вместо пикселей математические функции, которые описывают линии символов.

    И последний шаг для вашего алфавита: локализация/раскладка клавиатуры. Тут всё просто: для этого используется Microsoft Keyboard Layout Creator. Инструкций в сети по нему тоже много — даже на хабре есть подробная инструкция с примерами. В целом там всё достаточно просто, но как в нём работать с новым алфавитом и кодировкой точно не скажу, т.к. я делал раскладку только для русского/английского и стандартных кодировок.

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

Как выглядят кракозябры?
670d4c201254a086434124.png
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы