Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

Categories:

программистское

Будет интересно только тем, кто знает, что такое Перл и Юникод. 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 год на дворе, типа.

Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 52 comments