Библиотека 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)
кодировка (charset) и кодовая таблица (codepage) иных операционных систем (WIN,DOS,MAC) для данной локали
(это работает корректно только при соответствии поддерживаемых локалей в LIBNATSPEC и GLIBC)
и предоставляет API для их использования, а также дополнительные функции, позволяющие:
дополнить параметры монтирования указанием кодировок в соответствии с типом файловой системы
преобразовывать строки из одной кодировки в другую
с транслитерацией при необходимости (для целей отображения
пользователю в ситуациях, когда его локаль не позволяет
воспроизвести все используемые символы)
Принципе построения: Вся получаемая информация по возможности
зависит от локали пользователя, если она не определена,
используется системная локаль. Предложенная в natspec автоустановка кодировок
монтирования выставляет автоопределённые значения по умолчанию.
НИКТО НЕ ОТМЕНЯЛ возможность задать кодировку вручную. Просто
умолчание становится не iso-8859–1, а то, которое положено по локали.
Базой для эвристики является таблица, получаемая примерно
по следующему алгоритму: По списку локалей, установленных
с glibc, имеющейся в локали информации об основной
кодировке, а также программе, получающей информации
о соответствии кодировок различных ОС из WINE,
формируется статический массив, который используется в библиотеке
в дальнейшем для определения кодировки по локали
и пр.
Библиотека написана на языке C с учётом максимально возможной
переносимости. В настоящий момент для сборки требуется
glibc и libpopt. Тестирование на других системах не проводилось.
Имеются интерфесы для других языков:
python
Имеется консольная программа, позволяющая получать определённые в библиотеке параметры. Например
$ natspec -l – показать системную локаль
$ natspec -i – вывести всю доступную информацию
(просьба посмотреть и высказать свои замечания по качеству определения ситуации на вашей машине)
Для ALT Linux:
В системе имеется файл /etc/sysconfig/i18n, в котором, кроме
всего прочего, задана системная локаль строчкой LANG=локаль. Например,
у меня в системе указано в этом файле: LANG=ru_RU.KOI8-R
Где скачать и как ознакомиться
Библиотека доступна в свободном репозитории пакетов Сизиф
На следующих ресурсах всегда выложены последние версии библиотеки:
С любыми вопросами можно обращаться по адресу, указанному в файле README проекта.
Я буду рад помочь собрать эту библиотеку для вашего дистрибутива.
Как использовать
В каталоге examples проекта лежат исправленные файлы и образцы патчей, решающих проблему
с кодировками для ряда программ. Возможно в вашей
системе эти патчи ещё не применены, или они
не внесены
в основную ветвь разработки программы.
Подобные проекты
Существуют программы, которые можно применять дополнительно для обеспечения совместимости.
Пакет h2du
Предоставляет программу dos2unix, которая позволяет осуществлять
преобразования концов строк из принятой в одной системе
в другую.
Имеется возможность автоматического определения исходного формата.
iconv
Рекомендуемое средство для перекодирования файлов из одной
кодировки в другую. Следует подчеркнуть, что при неуказании
одной из кодировок она подразумевается равной кодировке
локали.