• GoldED+ Unicode edition

    From Eugene Subbotin@2:5075/35 to All on Fri Aug 28 15:56:24 2026
    Hello All!

    Собрал GoldED+, который держит текст внутри себя в UTF-8. В сеть при
    этом ничего нового не уходит - в эхи пишет в CP866, как и писал.

    Что это даёт:
    - письма в разных кодировках в одной эхе показываются каждое в своей,
    одновременно - CP866, KOI8-R, CP1251, CP437, CP850, ISO-8859, UTF-8
    - на linux/bsd/macos больше не нужен ни luit, ни отдельный screen в
    koi8-r - работает в родном UTF-8 терминале как есть
    - в Windows Terminal и в conhost широкие символы (CJK) занимают свои
    две клетки, а не давятся в одну, разъезжая всю строку
    - кодировку берёт из системы, настраивать ничего не надо
    - перекодирует через iconv; на windows - системным интерфейсом кодовых
    страниц, на os/2 - через ULS. Таблицы .chs больше не нужны, эти знают
    все пары сами. И под DOS тоже - в архиве сборка с GNU libiconv

    Про первый пункт подробнее, потому что он и есть главный. Раньше текст
    внутри голеда был однобайтовым, и всё упиралось в кодировку терминала.
    Письмо с CHRS: CP437 или CP850 на экране в CP866 перекодировать было
    некуда: ни умляутов, ни диакритики в CP866 просто нет. а их месте
    получались вопросительные знаки или мусор - и немецкие, польские,
    французские эхи читались как придётся. То же самое было с KOI8-R
    терминалом. Теперь экран в UTF-8, а там есть всё сразу: немецкое
    письмо в CP850, русское в CP866 и польское в CP852 лежат в одной эхе
    рядом и все три показываются так, как написаны.

    Заодно разобран CHRS: IBMPC. Идентификатор старый и мутный: сначала он
    значил CP437, а потом стал значить "кодовая страница той машины, где
    письмо писали" - то есть у нас CP866. Раньше это работало по
    случайности - таблицы для IBMPC никто не заводил, байты шли насквозь,
    терминал был в CP866, и выходило верно. А стоило понять IBMPC
    буквально, как CP437, и русское письмо разваливалось. Теперь оно
    разбирается явно: берётся кодировка сессии, если она однобайтовая, а на
    UTF-8 сессии - DOS-кодировка из локали, у нас CP866. Если рядом стоит
    ^ACHRS или CODEPAGE: - он главнее, как и требует FTS-5003.

    CHRS: ASCII понимается строго семибитным, ISO 646-1, как в стандарте.
    Если письмо объявлено как ASCII, а внутри восьмибитные байты, они
    станут вопросиками - но такое письмо помечено неверно самим
    отправителем, и старый голед с таблицей asc_* делал ровно то же.

    одлист надо перекомпилировать. В индексе имя лежало в 36 байтах - это
    36 символов, пока символ был байтом. В UTF-8 столько же занимают
    семнадцать русских букв, и "Александр Христофоров" (41 байт) туда уже
    не влезает - обрезается посередине. Поле расширено до 80. Формат записи
    от этого поменялся, старый .gxn голед не примет - гоняйте goldnode из
    этого же архива.

    овых ключей в конфиге всего два:

    XLATCONFIGSET - в какой кодировке написаны собственные файлы голеда:
    golded.cfg, языковой файл, шаблоны, файлы таглайнов,
    хелп
    XLATAREASET - в какой кодировке описания эх в area-файле тоссера.
    е задан - берётся XLATCONFIGSET

    Обе строки должны стоять в самом начале конфига, до любой строки с
    неанглийским значением: значения перекодируются по мере чтения файла.
    Типичный случай - терминал уже UTF-8, а конфиг и языковой файл остались
    в CP866:

    XLATCONFIGSET CP866

    Ещё есть переменная окружения GOLDED_CONSOLE (только Windows): cells
    или stream - если голед не угадал, как ваша консоль умеет рисовать
    широкие символы.

    А если хочется именно писать в UTF-8 - для этого есть эхи UTF-8 и UTF8.FTN.MESSAGING, подписывайтесь у аплинка и пишите там на любом
    языке. У меня под них отдельная группа:

    GROUP UTF-8;
    MEMBER UTF-8, UTF8.FTN.MESSAGING
    XLATIMPORT UTF-8
    XLATEXPORT UTF-8
    ENDGROUP

    В остальных эхах при этом всё остаётся как было, в CP866.
    Собранное - пятнадцать вариантов, DOS, OS/2, Windows (в том числе
    MSVC6), Linux, macOS, Solaris, Haiku:

    https://github.com/evs38/golded-plus/releases

    Кто собирает сам:

    git clone https://github.com/evs38/golded-plus.git

    Ветка unicode там по умолчанию. Собирается как обычно - cmake или
    make PLATFORM=lnx (или что там у вас), подробности в INSTALL
    и docs/building.txt. а юниксах нужны curses и iconv.

    Про curses стоит сказать отдельно: сейчас идёт переходный период и
    легко промахнуться. Работа с широкими символами жила в отдельной
    библиотеке ncursesw, и во многих системах её больше нет как таковой -
    начиная с ncurses 6 все широкие функции лежат прямо в обычной ncurses,
    а ncursesw либо осталась ссылкой на неё для совместимости, либо
    исчезла совсем. В pkgsrc, например, отдельной ncursesw уже нет, там
    только ncurses - и поддержка там уже есть. о на системах постарше это
    до сих пор два разных пакета, и нужная - та, что с "w".

    Правило простое: есть в системе ncursesw - ставьте её. ет - значит
    широкие функции уже в обычной ncurses, ставьте её. Сборка потом сама
    напишет, что нашла и умеет ли оно широкие символы.
    iconv на linux сидит в самой libc, на bsd и macos обычно ставится
    отдельной libiconv из пакетов, но бывают и случаи когда есть старый
    curses прямо в системе (как в NetBSD).

    а Windows не нужно ни того, ни другого: экран рисует сама консоль, перекодировкой занимается системный интерфейс кодовых страниц. а OS/2
    то же самое - VIO для экрана и ULS для перекодировки. Под DOS нужен
    libiconv для djgpp, если собирать с ICONV=1.

    Что появилось из ключей сборки (в make так, в cmake то же самое через
    -D, с префиксом GOLD_ у последних двух):

    GOLD_UTF8=0 держать текст однобайтовым, как раньше. По
    умолчанию 1 везде, кроме DOS
    WIDE_NCURSES=0 работать со старым, восьмибитным curses, даже
    если найдена библиотека с поддержкой широких
    символов
    EXTERNAL_CURSES=0 брать curses только системный, не из пакетов
    EXTERNAL_ICONV=0 то же про iconv

    По умолчанию на юниксах curses и iconv берутся из пакетного менеджера (/usr/pkg, /usr/local, /opt/homebrew, /opt/local, /opt/csw), системные - запасной вариант: пакетный ncurses обычно новее и умеет широкие
    символы, а пакетный libiconv знает больше кодировок.

    а OS/2 перекодировка идёт через ULS - это системная работа с
    Юникодом. Подхватывается сама, если найдены заголовки OS/2 Toolkit;
    если их нет, сборка получится на таблицах.

    DOS-сборка в архиве собрана с ICONV=1, libiconv для djgpp вкомпилирован статически, так что таблицы .chs там не нужны. Если собирать без
    ICONV=1, DOS останется на таблицах, как раньше.

    Багов наверняка много: голед - здоровенный конструктор, который рос
    годами, и всех его функций толком никто уже не помнит :) Трогали при
    этом почти всё, где на экран попадает текст. Так что найдёте глюки -
    пишите, разберу.

    * Originally in RU.GOLDED
    * Crossposted in RU.FIDONET.TODAY
    * Crossposted in RU.FTN.DEVELOP
    * Crossposted in RU.UNIX.FTN
    * Crossposted in SU.FIDOTECH

    Eugene

    ... It's full of stars!
    --- GoldED+/BSD 1.1.5-b20260828 (NetBSD 11.0 Intel Core Haswell)
    * Origin: FireFox Station (2:5075/35)