Небольшое вступление
Насколько известно на разных компьютерных платформах, да и даже в разных
операционных системах, применяются различные кодировки символов. Для России
их аж несколько: KOI8-R, Windows-1251, IBM-866, ISO8859-5 -- самые известные!
Есть также кодировка для Apple, Cyrillic-EBCDIC и наконец какая-то IBM-855
(просто Cyrillic). Естественно, что надо как-то передавать данные между различными
платформами, что приводит к необходимости иметь какую-то систему перекодировки
между всеми этими кодовыми страницами.
Положение ещё усугубялется тем, что
в некоторых раcпределённых сетевых программах (особенно это касается творений
гениев программирования для Windows, например ICQ) используется только кодировка
Windows-1251 . Как показывает практика, битва за обучение Windows методам
перекодировки результатов не приносят.
Пользователи OS/2 (как наиболее умудрённые
опытом в борьбе с Windows), отличающиеся инициативностью, изобрели некое средство,
названное dcplus (из проекта DCPack).
Работаем с код.страницами стандартными средствами OS/2
Наверное когда-то DCplus было жизненно необходим, но в более поздних версия
OS/2, по-моему начиная с 4-й, появилась встроенная система поддержки языковых
извращений в виде дирректории \LANG в корне загрузочного диска. И,
О ЧУДО, в её составе есть ВСЕ известные кодовые таблицы для русского языка.
Но корпорация IBM отличается тем, что никогда ничего не делает на 100 процентов
:) В этом случае тоже. Но не будь мы пользователями OS/2, если нам не удастся
уломать IBM.
К счастью в последнем известном мне toolkit (набор ПО для разработки своих
программ) IBM таки умудрилась преобразовать libc библиотеки, предоставляющие
интерфейс к динамическому рантайму (\os2\dll\libc*), в формат понимаемый
большинством линкеров. Этому уже была посвящена статья
опубликованная на нашем сервере, и что возрадовало меня особо, IBM смогла
таки поместить в эти библиотеки ссылку на чудесную функцию iconv. ОНА ДОЛЖНА
СПАСТИ НАС (Подумал тут я)!
Описание этой функции находится в файле \os2tk45\book\xpg4ref.inf
того самого набора юного программиста для OS/2.
Итак, зачем нам всякие dcplus и прочие штучки, если в OS/2 уже есть встроенный
код, который неплохо работает, для перекодировки данных 'из' и' в' разные
кодовые страницы страницы. Надеюсь вы уже скачали тулкит и ознакомились с
вышеуказанным файлом, именно поэтому я не буду повторять здесь описание этой
функции. Расскажу лишь о том, до чего вы, возможно, сами не догадаетесь (прошу
прощения у догадавшихся :-).
Как оно устроено
Обратим взоры в сторону директории \LANG, особенно в ту её сторону
которая называется \LANGUAGE\CODEPAGE. Если быть ещё более конкретным,
нас интересует файл UCSTBL.LST . При просмотре этого файла (например <F3>
в FC/2 или, например, type UCSTBL.LST |more) в самом начале мы видим следующие
(или примерно таковые) строки:
#
# Name: ucstbl.lst # # Desciption:
# This table gives the alias name for ULS codepage converters.
#
# The first column is user specified codepage name.
# The second column is the actual codepage name.
#
# Copyright:
# Copyright IBM Corp. 1996, 1998
#
# Notes:
# 1. All names must be ASCII-7 alphanumeric.
# 2. Hyphens are ignored in both alias and actual name
# 3. OS/2 searches this table case independent
#
Это, как вы догадались, некий комментарий к этому файлу (по которому сразу
видно, что фирма IBM выпускает ещё и Unix систему AIX). Краткий перевод:
"Эта таблица псевдонимов для перекодировщиков
ULS (прим. пер. наверное ULS это "Универсальная Языковая Поддержка"). Первая
колонка -- собственно псевдоним, придуманный пользователем. Вторая -- название
действительной кодовой таблицы. (прим. пер. не, мне нравится стиль писавших
эти комментарии! А ещё говорят, что у IBM плохая документация) Наши копирайты.
Примечания:
- Все имена должны состоять из 7-ми битных букво-цифр.
- Знаки "дефис" ("-") -- игнорируются для обеих колонок.
- OS/2 игнорирует регистр при просмотре этой таблицы."
Ниже идут строки с псевдонимами и названиями действительных кодовых страниц.
Действительные кодовые страницы в понимании IBM, видимо, те, которые действуют
у них. Для каждой такой страницы в этой поддиректории есть файл (буду рад
если кто-нибудь пришлёт его формат) отражающий сущность этой страницы.
Использование
В качестве иллюстрации к статье прилагается пример использования
этой функции на языке C. Данная программа читает данные из stdin, перекодирует
их в соответствии с названиями кодовых страниц, указанных в качестве параметров,
пишет в stdout и выводит ошибки в stderr (типа "мы любим Юникс").
У вас могут возникнуть некоторые проблемы с её компиляцией. Для их успешного
разрешения вам понадобится-таки IBM OS/2 Toolkit ver 4.5. В нём есть файлы
iconv.h libc*.lib. Советую также обратиться к статье
"Про динамический рантайм" ибо реализация функции iconv существует только
в виде DLLки.
PS. А ещё там есть функция nl_langinfo. Ну и всякие другие тоже есть ;-)
PPS. Большое спасибо Виталию Тимчишину, откомпилировшему
пример.
Пример использования
текст примера использования ICONV на C
Исполняемый вариант примера
Обсудить материал (число отзывов:6) предыдущий материал | следующий материал |