[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[проект] метод передачи названия кодировки используемой на других платформах для данной локали



 Hi, 

 Данный проект предлагает способ как идеологически-корректным образом 
передавать навание кодировки, используемой на других платформах для данной 
локали. Это может быть необоходимо для экспорта/импорта файлов в
форматах, которые не позволяют указать кодировку содержащихся в них данных, 
для чтения с/на этих платформах. Например, надо импортировать файл word6.0
содержащий не-latin1 символы. Если кодировка используемая внутри приложения,
не совпадает с кодировкой, в которой записаны данные в файле, текстовые данные
очевидно надо перекодировать в требуемую кодировку. Тогда как "требуемая"
кодировка всегда известна, механизмы передачи названия кодировки
импортируемых/экспортируемых данных идеологически нестройны или не полны
(такие как таблицы содержащиеся внутри самого приложения, явный вопрос
к пользователю о используемой кодировке или поддержка только очень
фиксированного набора кодировок).

 В качестве должного способа передачи кодировки я предлагаю следующий:

 Для каждой платформы назначается уникальный среди платформ идентификатор
(например windows для windows от MS, mac для различных версий MacOS, dos для
дос и пр.) Желательно чтобы имя содержала только буквы, цифры, символ
подчеркивания и дефис.
 В файле /usr/share/locale/locale.alias вводится псевдолокаль, имя
которой состоит из имени языка, названия территории (если кодировка для данной
платформы зависит от территории) точки и идентификатора той платформы, данной
добавленой локали соотвествует истинная локаль которая (возможно являясь
алиасом) соотвествует каноническому имени локали с указаннием именем чарсета.
 Приложение, чтобы определить название кодировки, используемой на платформе A
сначала просматривает в locale.alias локаль с именем, образованным из
названия языка и территории с приклеенным идентификатором интересующей
платформы, если полученному имени не соотвествует ни одно "реальное" имя
локали (то есть не оканчивающееся на идентификатор платформы), то приложение
ищет в locale.alias локаль с именем, образованным из имени языка и
идентификатора платформы. Если и такому имени локали не соотвествует ни одна
"реальная" локаль, то приложение в праве считать, что кодировка на платформе
назначения аналогичная.

 Например, если LANG=ru_RU.KOI8-R и приложение хочет узнать о названии
кодировки исмпользуемой на платформе Windows для данной локали (предположим, 
идентификатором платформы является windows), оно должно искать в locale.alias
алиасы в следующем порядке:

ru_RU.windows
ru.windows

 Для русского языка ru.windows должно быть алиасом на ru_RU.cp1251 - из чего
приложение сделает вывод, что название кодировки на платформе Windows есть
cp1251.

 За основную локаль (имя языка и территории которой будет использовано для
приклеивания идентификатора платформы) должен браться развернутое (то есть
рекурсивно просмотренное в locale.alias) имя локали-источника/приемника.
 Например, если LANG=russian (допустимое, но идеологически некорректное имя
локали)  приложение путем рекурсивного применения алиасов из
locale.alias обнаружит, что каноническое имя локали "russian" есть
"ru_RU.KOI8-R" и начнет формировать имена локалей для поиска в locale.alias 
c ru_RU.windows а не russian.windows (такое требование гаранитирует, что нужно
всего лишь 1 псевдолокаль для передачи имени кодировки на данной платформе).

 
 Какие будут комментарии на данный проект?
 Я лично не вижу никаких из[янов. 
 Если их действительно нет - может начать пробивать этот проект в различные
организации по стандартизации (по-крайне мере линукса) и glibc?

 Best regards,
  -Vlad