avva: (Default)
[personal profile] avva

Будет интересно только тем, кто знает, что такое Перл и Юникод. ncurses по умолчанию не поддерживает многобайтные символы, в том числе UTF-8. Начиная с какой-то недавней версии, есть возможность построить отдельную библиотеку, libncursesw вдобавок к обычной libncurses, у которой идентичный интерфейс и встроенная поддержка многобайтных символов.

Однако перловский интерфейс к curses, библиотека Curses, ничего об этом не знает и линкуется всегда с libncurses.

Предположим, я хочу написать программу на Перле, с текстовым интерфейсом через curses, с поддержкой вывода в разных кодировках, в том числе (самое простое и идеальное) utf-8, если терминал поддерживает. Я это не могу сделать, потому что libncurses портит некоторые мультибайтные символы, вставляя вместо них мусор. Стандартный интерфейс к curses-библиотеке ОС, который будет установлен там, где будет бежать моя программа - какой-нибудь линукс или BSD - будет заранее слинкован с libncurses (та часть интерфейса, которая написана на C и компилируется в динамическую библиотеку, которую перл подгружает в рантайме - Curses.so - динамически слинкована с libncurses). Что я могу сделать? Написать новую версию интерфейса Curses, которая линкуется с libncursesw если такая есть, и послать ее мейнтейнеру? Там всего-то менять - список библиотек для поиска, потому что на уровне API библиотеки ncurses и ncursesw совместимы. Но не факт, что он примет; если да, пройдет еще полгода, пока выпустит новую версию, и еще год после этого, пока она войдет в стабильные пакеты основных дистрибутивов. Написать полностью свой интерфейс к libncursesw и включить его в пакет программы? Идиотизм. Включить в пакет программы измененную версию стандартного Curses, которая линкуется с libncursesw, и устанавливать ее в отдельном месте под другим именем? Идиотизм. Ах да, есть еще прелестная возможность хака, скажем, скопировать системный /lib/libncursesw.so.5.5 в отдельную копию в свою директорию, назвать копию libncurses.so.5 (без w), и поставить LD_LIBRARY_PRELOAD так, чтобы она загрузилась вместо обычной libncurses.so.5, когда будет загружаться стандарнтый интерфейс Curses. Причем все работает тогда, я проверил. Но это ж несерьезно.

2006 год на дворе, типа.

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
2829 3031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 31st, 2025 04:21 am
Powered by Dreamwidth Studios