Библиотека NATSPEC предназначена для сглаживания национальных особенностей при использовании программ, а точнее:
решения проблемы с кодировкой для большинства случаев;
предоставления различных вспомогательных средств, облегчающих локализацию программ.
Причины появления
Пользователь Linux, который действительно работает в этой системе, часто сталкивается с проблемами кодировок: как содержимого файлов, так названий файлов. Практически на каждом шагу встречаются случаи, когда пользователя заставляют указывать кодировку (названий) файлов, с которыми он имеет дело. Это происходит при
монтировании дискет, компакт-дисков, флэш-дисков, принесённых жёстких дисков и других носителей;
монтировании сетевых ресурсов через SAMBA;
записи дисков (создании файловых систем) с помощью команд mkisofs, growisofs, программ k3b, xcdroast и подобное;
в файловом менеджере mc, если вы хотите воспользоваться заложенной туда возможностью перекодирования текстов
Более того, существует целое непаханное поле программ, где надо бы указывать кодировку, а нечем:
в ftp-серверах и ftp-клиентах;
все используемые для установки ОС файловые системы; файловая система Rock Ridge на оптических дисках;
многие мультимедиа-проигрыватели.
Зачастую эти проблемы не решены, или решены частным образом, или решены не совсем корректным патчем.
Становится понятно, что в системе должна быть возможность получить ответ на следующие вопросы:
какая кодировка используется для хранения названий файлов в системе?
какая кодировка используется для хранения содержимого файлов?
При этом часто можно слышать мнение, что эти ответы в общем случае не имеют ответа, и принципиально иметь не могут,
а потому не надо и невозможно пытаться на них ответить.
По большому счёту ситуацию практически исправляет (если полностью забыть о совместимости) полный перевод
системы на кодировку UTF-8. К сожалению, даже при этом возникнет ряд проблем (см. Проблемы Перехода На UTF 8)
Но вопросы совместимости никто не отменял и в любом случае порядок взаимодействия как с другими операционными системами (Windows, DOS, MAC), так и с Unix-подобными операционными системами должен быть установлен и сформулирован. Особенно это важно для дистрибутива.
По (возможно, беглом) рассмотрении кода таких проектов как WINE, Linux kernel, gettext, Ly X, GLIBC, GLIB, mount, submount, cdrtools, zip, dia, beep, xmms были сформулированы требования и создана реализация библиотеки, которая позволяет получать ответы на вопросы о кодировках,
а также имеет ряд вспомогательных функций, востребованных во многих проектах.
Зачем она нужна
Существует множество программ, тесно работающие с кодировками, но по объективным обстоятельствам идущие своим путём в их поддержке.
Чего стоит только поддержка перекодирования, встроенная в mkisofs, и использующая nls, выдранный из ядра Linux неизвестно какой версии.
Данный проект создан для того, чтобы решать большинство вопросов, связанных с перекодированием, вне конкретной программы. Это повышает
переносимость, и позволяет не отвлекаться конкретному проекту на написание костылей для решения общесистемных проблем.
Библиотека не является серебряной пулей или панацеей, это всего лишь средство повысить переносимость данных между разными системами, и облегчить жизнь пользователей и программистов на текущем переходном этапе, когда всё прогрессивное человечество одной ногой перешло в UTF-8 (нет, эта аббревиатура не относится к НЛО или гробам).
Как она устроена
Библиотека LIBNATSPEC определяет такие важные понятия, как
кодировка локальной файловой системы (filename encoding)
пользовательская локаль (user locale)
системная локаль (system locale)
кодировка текущей локали
кодировка (charset) и кодовая таблица (codepage) иных операционных систем (WIN,DOS,MAC) для данной локали
и предоставляет API для их использования, а также дополнительные функции, позволяющие:
дополнить параметры монтирования указанием кодировок в соответствии с типом файловой системы
перекодировать строки с потерями (для целей отображения пользователю в ситуациях, когда его локаль
не позволяет воспроизвести все используемые символы)
Базой для эвристики является таблица, получаемая примерно по следующему алгоритму: По списку локалей, установленных с glibc, имеющейся в локали информации об основной кодировке, а также программе, получающей информации о соответствии кодировок различных ОС из WINE, формируется статический массив, который используется в библиотеке в дальнейшем для определения кодировки по локали и пр.
Библиотека написана на языке C с учётом максимально возможной переносимости. В настоящий момент для сборки требуется
glibc и libpopt. Тестирование на других системах не проводилось.
Имеются интерфесы для других языков:
python
Имеется консольная программа, позволяющая получать определённые в библиотеке параметры. Например
$ natspec -l – показать системную локаль
$ natspec -i – вывести всю доступную информацию
(просьба посмотреть и высказать свои замечания по качеству определения ситуации на вашей машине)
Для ALT Linux:
В системе имеется файл /etc/sysconfig/i18n, в котором, кроме всего прочего, задана системная локаль строчкой LANG=локаль. Например, у меня в системе указано в этом файле: LANG=ru_RU.KOI8-R
Где скачать и как ознакомиться
Библиотека доступна в свободном репозитории пакетов Сизиф
На следующих ресурсах всегда выложены последние версии библиотеки:
С любыми вопросами можно обращаться по адресу, указанному в файле README проекта.
Я буду рад помочь собрать эту библиотеку для вашего дистрибутива.
Как использовать
В каталоге examples проекта лежат исправленные файлы и образцы патчей, решающих проблему
с кодировками для ряда программ. Возможно в вашей системе эти патчи ещё не применены, или они не внесены
в основную ветвь разработки программы.