[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Создание перекодировщиков с помощью интерфейса iconv

В этом разделе описаны основные принципы использования структур и функций API iconv для создания перекодировщиков. Здесь рассматриваются порядок работы в среде и особенности создания перекодировщиков; кроме того, приведен пример программы, включая исходный текст, файл заголовка и файл сборки. Вся информация относится к рабочей среде iconv операционной системы AIX.

Набор функций iconv_open, iconv и iconv_close позволяет создавать и использовать перекодировщики различного типа. Эти функции могут применяться для преобразования символов из одного кодового набора в другой. Формат вызова и использование функций iconv_open, iconv и iconv_close определены стандартом X/Open XPG4.

Кодовые наборы и перекодировщики

Кодовые наборы можно разбить на две категории: наборы с учетом состояния и наборы без учета состояния.

Кодовые наборы с учетом состояния и перекодировщики

Кодовые наборы с учетом состояния применяют открывающие и закрывающие символы для изменения текущего состояния. Например, открывающий символ может обозначать начало блока двухбайтовых данных в потоке символов, а закрывающий - конец блока. По окончании передачи двухбайтовых данных получаемая информация начинает интерпретироваться как однобайтовые символы. Примером подобного кодового набора является кодировка IBM-930, используемая, в основном, в больших системах.

Перекодировщики, учитывающие коды состояния, как правило, являются довольно сложными из-за того, что требуется дополнительная обработка.

Кодовые наборы без учета состояния и перекодировщики

Кодовые наборы без учета состояния относятся к одному из следующих двух типов:

Учтите, что преобразования кодов имеют смысл только в том случае, когда различные кодовые наборы обозначают одни и те же символы.

Простейшим вариантом преобразования является преобразование между однобайтовыми наборами, например, преобразование из ISO8859-1 в IBM-850. Перекодировщики однобайтовых кодовых наборов строятся на обычном перекодировании по таблицам. При преобразовании между многобайтовыми кодами, например, из IBM-eucJP в IBM-932, используются алгоритмы, а не таблицы, так как таблицы могут оказаться слишком длинными.

Среда iconv - Обзор структур

Среда iconv включает функции iconv_open, iconv и iconv_close. Она построена на основе единой структуры, которая входит во все перекодировщики. Эта базовая структура инициализируется при загрузке объектного модуля перекодировщика. По окончании загрузки модуля выполняется переход на точку входа - функцию instantiate. Она инициализирует базовую структуру и возвращает базовый дескриптор перекодировщика. Этот дескриптор применяется при последующем вызове функции init, которая выделяет память под структуры данных программы. Функция init возвращает другой дескриптор, который содержит указатель на базовый дескриптор перекодировщика. Функция init выделяет память в соответствии с требованиями программы и может вызывать другие перекодировщики. Функция init предназначена для инициализации конкретного перекодировщика, в то время как instantiate является общей точкой входа.

После создания и инициализации дескриптора необходимо обеспечить работу перекодировщика, добавив необходимый код в функцию exec. Если перекодировщик выполняет преобразование по таблице, то единственное, что требуется сделать - это предоставить исходный файл в формате, удовлетворяющем требованиям утилиты genxlt, которая перекодирует символы с созданием файла в формате, совместимом со средой iconv.

Структуры файла iconv.h

В файле iconv.h из каталога /usr/include определены следующие структуры:

typedef struct __iconv_rec   iconv_rec, *iconv_t;
struct __iconv_rec   {
    _LC_object_t  hdr;
    iconv_t (*open)(const char *tocode, const char *fromcode);
    size_t (*exec)(iconv_t cd, char **inbuf, size_t *inbytesleft,
            char **outbuf, size_t *outbytesleft);
    void  (*close)(iconv_t cd);
};

Общая базовая структура определена следующим образом ( /usr/include/iconv.h):

typedef struct _LC_core_iconv_type      _LC_core_iconv_t;
struct _LC_core_iconv_type {
        _LC_object_t  hdr;
        /* инициализация процедуры */
        _LC_core_iconv_t        *(*init)();
        size_t  (*exec)();
        void    (*close)();
};

Для каждого перекодировщика выделяется статическая область памяти, в которой хранится структура _LC_core_iconv_t. Эта область инициализируется в функции instantiate, входящей в любой перекодировщик.

Порядок работы в среде iconv

В этом разделе описан порядок работы функций в среде iconv.

Функция iconv_open

Приложение может запустить перекодировщик с помощью следующего вызова:

iconv_open(char *to_codeset, char *from_codeset)

Целевой и исходный кодовые наборы (to_codeset и from_codeset) применяются при выборе перекодировщика с использованием пути поиска, задаваемого в переменной среды LOCPATH. Функция iconv_open загружает объектный модуль с помощью функции _lc_load, передавая ей имя перекодировщика в виде объединенных строк from_codeset и to_codeset, заданных в параметрах функции iconv_open.

CONVERTER NAME= "исходный_набор" + "_" +"целевой_набор"

Если применяется исходный_набор) IBM-850 и целевой_набор ISO8859-1, то именем перекодировщика будет IBM-850_ISO8859-1.

После загрузки объектного модуля функцией-загрузчиком _lc_load эта функция передает управление точке входа модуля. Это первое обращение к перекодировщику. После этого функция instantiate инициализирует базовую структуру _LC_core_iconv_t. Затем iconv_open вызывает функцию init, связанную с полученной базовой структурой. Функция init отвечает за выделение памяти и инициализацию структур данных загруженного перекодировщика. Функция iconv_open возвращает структуру загруженного перекодировщика. Возвращаемый тип данных в клиентском приложении преобразуется к iconv_t. Таким образом, приложение не имеет доступа ко всей структуре - оно может работать только с ее стандартной частью, определенной типом данных iconv_t. При этом внутри перекодировщика эта структура используется полностью. Приложения, использующие перекодировщики iconv, не должны изменять дескриптор перекодировщика - он должен рассматриваться как логически законченная, неизменяемая структура.

Точка входа

В каждом перекодировщике необходимо определить точку входа, чтобы при его вызове функцией iconv_open выполнялся автоматический переход на соответствующую функцию. Стандартной точкой входа является функция instantiate - она должна быть определена в каждом перекодировщике. Эта точка входа описывается в файле сборки следующим образом:

LDENTRY=-einstantiate

При загрузке объектного модуля функцией iconv_open() выполняется запуск функции instantiate. Этой функции известен тип перекодировщика. Она инициализирует статический базовый дескриптор перекодировщика - структуру _LC_core_iconv_t cd.

Базовый дескриптор перекодировщика cd содержит указатели на функции init, _iconv_exec и _iconv_close перекодировщика. Функция instantiate возвращает базовый дескриптор, который используется дальше в программе. Структура _LC_core_iconv_t объявлена в файле /usr/include/iconv.h.

При вызове iconv_open выполняются следующие действия:

  1. С помощью переменной среды LOCPATH выполняется поиск перекодировщика, загружается соответствующий объектный модуль и вызывается его функция instantiate. При успешном завершении она возвращает базовый дескриптор перекодировщика (_LC_core_iconv_t *cd). Функция объектного модуля instantiate отвечает за инициализацию заголовка базовой структуры.
  2. После этого функция iconv_open вызывает функцию init, указатель на которую передается в базовом дескрипторе. Функция объектного модуля init отвечает за выделение памяти под внутренний дескриптор перекодировщика. Пример такого дескриптора для перекодировщика, не учитывающего состояние, приведен ниже:

    typedef struct _LC_sample_iconv_rec {
                      LC_core_iconv_t        core;
      
                } _LC_sample_iconv_t;
      
    Для инициализации такой структуры перекодировщик должен
    включать следующую функцию init:
     
    static _LC_sample_iconv_t*  
    init (_LC_core_iconv_t *core_cd, char* toname,char* fromname)
    {
       _LC_sample_iconv_t     *cd;    /* дескриптор перекодировщика */
     
        /*
        **        Выделить память под дескриптор
        **/
        if(!(cd = ( _LC_sample_iconv_t *) malloc (
                        sizeof(_LC_sample_iconv_t ))))
                return (NULL);
          
        /*
        ** Скопировать базовую часть дескриптора,
        ** переданную функции
        */
        cd->core = *core_cd;
        /*
        **      Вернуть дескриптор перекодировщика
        */
        return cd;
    }
    

Функция iconv

Функция iconv вызывается приложением для преобразования символов из одного кодового набора в другой. Функция iconv запускает функцию exec, указатель на которую передается в базовом дескрипторе.

Функция iconv_close

Функция iconv_close вызывается приложением для освобождения памяти, выделенной для преобразования кодов. Функция iconv_close запускает функцию close, указатель на которую передается в базовом дескрипторе.

Создание перекодировщика

Этот раздел посвящен созданию перекодировщика на основе рассмотренных выше принципов. Сначала рассматриваются простые перекодировщики, а затем - более сложные. В разделе обсуждаются следующие вопросы:

В любом перекодировщике должны быть определены следующие функции:

Во внутренней структуре данных перекодировщика первым элементом должна быть базовая структура iconv. Например:

Пример 1:

        typedef struct _LC_example_rec {
            /* Первый элемент - базовая структура */
                _LC_core_iconv_t        core;
            /* Остальное - это данные (зависят от конкретной процедуры) */
                iconv_t         curcd;
                iconv_t         sb_cd;
                iconv_t         db_cd;
                unsigned char   *cntl;
        } _LC_example_iconv_t;

Пример 2: Простая структура:

        typedef struct _LC_sample_iconv_rec {
                _LC_core_iconv_t        core;
        } _LC_sample_iconv_t;
    

Алгоритмические перекодировщики, не учитывающие состояние

В каждом перекодировщике должны присутствовать указанные выше функции. Приведены только заголовки функций, за исключением функции instantiate, которая является общей для всех перекодировщиков и должна быть реализована стандартным способом.

Ниже приведен пример алгоритмического перекодировщика из IBM-850 в ISO8859-1, не учитывающего состояние:

#include <stdlib.h>
#include <iconv.h>
#include "850_88591.h"
/*
 *      Имя :  _iconv_exec()
 *      
 *      Функция определяет метод преобразования.  
 */
static size_t   _iconv_exec(_LC_sample_iconv_t *cd, 
                         unsigned char** inbuf, 
                         size_t *inbytesleft,
                         unsigned char** outbuf, 
                         size_t *outbytesleft)
/*
 *      cd               : дескриптор перекодировщика
 *      inbuf            : входной буфер
 *      outbuf           : выходной буфер
 *      inbytesleft      : объем данных (в байтах) во входном буфере
 *      outbytesleft     : объем данных (в байтах) в выходном буфере
 */
{
}
 
/*
 *      Имя :   _iconv_close()
 *      
 *      Освободить память, выделенную под дескриптор
 */
static void      _iconv_close(iconv_t cd)
{
}
 
/*
 *      Имя :  init()
 *      
 *      Выделить память и инициализировать дескриптор перекодировщика
 */
static _LC_sample_iconv_t        *init (_LC_core_iconv_t *core_cd, 
                                  char* toname, char* fromname)
{
}
 
/*
 *       Имя :  instantiate()
 *       
 *       Инициализировать базовую часть дескриптора
 */
_LC_core_iconv_t         *instantiate(void)
{
        static _LC_core_iconv_t   cd;
 
        /*
        ** Значения _LC_MAGIC и _LC_VERSION определены 
        ** в <lc_core.h>, а _LC_ICONV и _LC_core_iconv_t
        ** определены в <iconv.h>.
         */
        cd.hdr.magic = _LC_MAGIC;
        cd.hdr.version = _LC_VERSION;
        cd.hdr.type_id = _LC_ICONV;
        cd.hdr.size = sizeof (_LC_core_iconv_t);
 
        /*
         *      Установить указатели на функции
         */
        cd.init = init;
        cd.exec = _iconv_exec;
        cd.close = _iconv_close;
 
        /*
         *      Вернуть базовый дескриптор
         */
        return &cd;
}

Перекодировщики, учитывающие состояние

Здесь приведены только заголовки функций, за исключением функции instantiate, которая является общей для всех перекодировщиков и должна быть реализована стандартным способом. Так как при преобразовании с учетом состояния требуется больше информации о тексте, в перекодировщике будут использоваться дополнительные структуры данных.

Ниже приведен пример перекодировщика из IBM-930 в IBM-932, учитывающего состояние.

Файл host.h содержит следующую структуру:

typedef struct _LC_host_iconv_rec {
                _LC_core_iconv_t        core;
                iconv_t         curcd;
                iconv_t         sb_cd;
                iconv_t         db_cd;
                unsigned char   *cntl;
        } _LC_host_iconv_t;

#include <stdlib.h>
#include <sys/types.h>
#include <iconv.h>
#include "host.h"

/*
** Функция _iconv_exec вызывается с помощью cd->exec()
*/
static int      _iconv_exec(_LC_host_iconv_t *cd,
        unsigned char **inbuf, size_t *inbytesleft,
        unsigned char **outbuf, size_t *outbytesleft)
{
        unsigned char    *in, *out;
        int              ret_value;

    if (!cd){
        errno = EBADF; return NULL;
    }

    if (!inbuf) {
        cd->curcd = cd->sb_cd;
        return ICONV_DONE;
    }

    do {
    if ((ret_value = iconv(cd->curcd, inbuf, inbytesleft, outbuf,
            outbytesleft)) != ICONV_INVAL)
            return ret_value;
        in = *inbuf;
        out = *outbuf;
        if (in[0] == SO) {
            if (cd->curcd == cd->db_cd){
                errno = EILSEQ; 
                return ICONV_INVAL;
            }
            cd->curcd = cd->db_cd;
        }
        else if (in[0] == SI) {
            if (cd->curcd == cd->sb_cd){
                errno = EILSEQ; 
                return ICONV_INVAL;
            }
                cd->curcd = cd->sb_cd;
        }else if (in[0] <= 0x3f && 
            cd->curcd == cd->sb_cd) {
            if (*outbytesleft < 1){
                errno = E2BIG; 
                return ICONV_OVER;
            }
                out[0] = cd->cntl[in[0]];
                *outbuf = ++out;
                (*outbytesleft)--;
        }
        else {
            errno = EILSEQ; return ICONV_INVAL;
        }
        *inbuf = ++in;
        (*inbytesleft)--;
    } while (1);
}
 
/*
** iconv_close - это макроопределение, ссылающееся на 
** эту функцию по указателю в базовой структуре iconv.
*/
static void   _iconv_close(_LC_host_iconv_t *cd)
{
    if (cd) {
        if (cd->sb_cd)
            iconv_close(cd->sb_cd);
        if (cd->db_cd)
            iconv_close(cd->db_cd);
        free(cd);
    }else{
        errno = EBADF;
    }
}
 
/*
** Функция init запускается при вызове iconv_open().
*/
static _LC_host_iconv_t   *init(_LC_core_iconv_t *core_cd, 
               char* toname, char* fromname)
{
        _LC_host_iconv_t*  cd;
        int   i;
 
    for (i = 0; 1; i++) {
        if (!_iconv_host[i].local)
            return NULL;
        if (strcmp(toname, _iconv_host[i].local) == 0 &&
            strcmp(fromname, _iconv_host[i].host) == 0)
            break;
    }
 
        if (!(cd = (_LC_host_iconv_t *)
                        malloc(sizeof(_LC_host_iconv_t))))
                return (NULL);
 
    if (!(cd->sb_cd = iconv_open(toname, _iconv_host[i].sbcs))) {
        free(cd);
        return NULL;
    }
    if (!(cd->db_cd = iconv_open(toname, _iconv_host[i].dbcs))) {
        iconv_close(cd->sb_cd);
        free(cd);
        return NULL;
    }
            cd->core = *core_cd;
    cd->cntl = _iconv_host[i].fcntl;
    cd->curcd = cd->sb_cd;
    return cd;
}
 
/*
** Метод instantiate() вызывается, когда iconv_open() загружает
** перекодировщик путем вызова __lc_load().
*/
_LC_core_iconv_t         *instantiate(void)
{
        static _LC_core_iconv_t
cd;
 
        cd.hdr.magic = _LC_MAGIC;
        cd.hdr.version = _LC_VERSION;
        cd.hdr.type_id = _LC_ICONV;
        cd.hdr.size = sizeof (_LC_core_iconv_t);
        cd.init = init;
        cd.exec = _iconv_exec;
        cd.close = _iconv_close;
        return &cd;
}

Примеры

  1. Ниже приведен пример алгоритмического перекодировщика из IBM-850 в ISO8859-1, не учитывающего состояние. В этом примере используется имя файла 850_88591.c.

    #include <stdlib.h>
    #include <iconv.h>
    #include "850_88591.h"
     
    #define DONE     0
     
    /*
     *      Имя :  _iconv_exec()
     *  
     *      Функция определяет метод преобразования.
     */
    static size_t  _iconv_exec(_LC_sample_iconv_t *cd, 
          unsigned char** inbuf, size_t *inbytesleft,
          unsigned char** outbuf, size_t *outbytesleft)
    /*
     *      cd               : дескриптор перекодировщика
     *      inbuf            : входной буфер
     *      outbuf           : выходной буфер
     *      inbytesleft      : объем данных (в байтах) во входном буфере
     *      outbytesleft     : объем данных (в байтах) в выходном буфере
     */
    {
            unsigned char   *in;   /* указатель на входной буфер */
            unsigned char   *out;  /* указатель на выходной буфер */
            unsigned char   *e_in; /* указатель на конец входного буфера */
            unsigned char   *e_out; /* указатель на конец выходного буфера */
     
        /*
         *   Если передан неправильный перекодировщик,
         *   функция устанавливает переменную errno и возвращает
         *   число байт, оставшихся непреобразованными.
         */
            if (!cd){
            errno = EBADF;
            return *inbytesleft;
            }
     
            /*
             *      Если входной буфер не существует или отсутствуют
             *      символы для перекодирования, функция возвращает
             *      0 (нет символов для перекодирования).
             */
            if (!inbuf || !(*inbytesleft))
                    return DONE;
     
            /*
             *      Установить указатели и инициализировать другие переменные
             */
            e_in = (in = *inbuf) + *inbytesleft;
            e_out = (out = *outbuf) + *outbytesleft;
     
         /*
          *     Выполнять преобразование кодовых знаков, пока
          *     входной буфер не будет исчерпан.
          *     При появлении ошибки (например, переполнения буфера)
          *     установить номер ошибки и выйти из цикла.
          */
             while (in < e_in) {
     
            /*
             *   Если в выходном буфере недостаточно места для хранения
             *   перекодированных данных, преобразование прерывается
             *   и устанавливается errno = E2BIG.
             */
            if (e_out <= out) {
                errno = E2BIG;
                break;
            }
     
            /*
             *   Преобразовать все входные данные и записать их
             *   в выходной буфер, затем обновить указатели
             *   на буферы.
             */
            *out++ = table[*in++];
     
        }   /* while */
     
        /*
         *  Обновить указатели на буферы и
         *  счетчики входных-выходных байт.
         */
         *inbuf = in;
            *outbuf = out;
        *inbytesleft = e_in - in;
        *outbytesleft = e_out - out;
     
        /*
         *   Вернуть число непреобразованных байт
         *   (0 при успешном завершении преобразования).
         */
        return *inbytesleft;
    }
     
    /*
     *      Имя :   _iconv_close()
     *  
     *      Освободить память, выделенную под дескриптор
     */
    static void      _iconv_close(iconv_t cd)
    {
        if (!cd)
            free(cd);
        else
            /*
             *  Если передан неправильный перекодировщик,
             *  установить errno = EBADF
             */
            errno = EBADF;
    }
     
    /*
     *      Имя :  init()
     *  
     *      Выделить память и инициализировать дескриптор перекодировщика
     */
    static _LC_sample_iconv_t*
    init (_LC_core_iconv_t *core_cd, char* toname,char* fromname)
    {
            _LC_sample_iconv_t     *cd;    /* дескриптор перекодировщика */
     
        /*
         *   Выделить память под дескриптор
         */
            if (!(cd = (_LC_sample_iconv_t *)
                            malloc(sizeof(_LC_sample_iconv_t))))
                    return (NULL);
     
        /*
         * Скопировать базовую часть дескриптора, переданную функции
         */
            cd->core = *core_cd;
     
        /*
         *   Вернуть дескриптор перекодировщика
         */
            return cd;
    }
     
    /*
     *       Имя :  instantiate()
     *  
     *       Инициализировать базовую часть дескриптора
     */
    _LC_core_iconv_t*   instantiate(void)
    {
            static _LC_core_iconv_t  cd;
     
        /*
         *   Значения 
         *  _LC_MAGIC и _LC_VERSION определены в <lc_core.h>.
         *  _LC_ICONV и _LC_core_iconv_t определены в <iconv.h>.
         */
        cd.hdr.magic = _LC_MAGIC;
        cd.hdr.version = _LC_VERSION;
        cd.hdr.type_id = _LC_ICONV;
        cd.hdr.size = sizeof (_LC_core_iconv_t);
     
        /*
         *      Установить указатели на функции
         */
            cd.init = init;
            cd.exec = _iconv_exec;
            cd.close = _iconv_close;
     
        /*
         *      Вернуть базовый дескриптор
         */
            return &cd;
    }
    
  2. Ниже приведен пример файла заголовка, названного 850_88591.h.

    #ifndef _ICONV_SAMPLE_H
    #define _ICONV_SAMPLE_H
     
    /*
     *      Define _LC_sample_iconv_t
     */
    typedef struct _LC_sample_iconv_rec {
            _LC_core_iconv_t   core;
    } _LC_sample_iconv_t;
     
    static unsigned char     table[] = { /*
     
     
            _______________________________________
            |                                       |
            |      IBM-850               ISO8859-1  |
            |_______________________________________|       
            /*      0x00     */              0x00,
            /*      0x01     */              0x01,
            /*      0x02     */              0x02,
            /*      0x03     */              0x03,
            /*      0x04     */              0x04,
            /*      0x05     */              0x05,
            /*      0x06     */              0x06,
            /*      0x07     */              0x07,
            /*      0x08     */              0x08,
            /*      0x09     */              0x09,
            /*      0x0A     */              0x0A,
            /*      0x0B     */              0x0B,
            /*      0x0C     */              0x0C,
            /*      0x0D     */              0x0D,
            /*      0x0E     */              0x0E,
            /*      0x0F     */              0x0F,
            /*      0x10     */              0x10,
            /*      0x11     */              0x11,
            /*      0x12     */              0x12,
            /*      0x13     */              0x13,
            /*      0x14     */              0x14,
            /*      0x15     */              0x15,
            /*      0x16     */              0x16,
            /*      0x17     */              0x17,
            /*      0x18     */              0x18,
            /*      0x19     */              0x19,
            /*      0x1A     */              0x1A,
            /*      0x1B     */              0x1B,
            /*      0x1C     */              0x1C,
            /*      0x1D     */              0x1D,
            /*      0x1E     */              0x1E,
            /*      0x1F     */              0x1F,
            /*      0x20     */              0x20,
            /*      0x21     */              0x21,
            /*      0x22     */              0x22,
            /*      0x23     */              0x23,
            /*      0x24     */              0x24,
            /*      0x25     */              0x25,
            /*      0x26     */              0x26,
            /*      0x27     */              0x27,
            /*      0x28     */              0x28,
            /*      0x29     */              0x29,
            /*      0x2A     */              0x2A,
            /*      0x2B     */              0x2B,
            /*      0x2C     */              0x2C,
            /*      0x2D     */              0x2D,
            /*      0x2E     */              0x2E,
            /*      0x2F     */              0x2F,
            /*      0x30     */              0x30,
            /*      0x31     */              0x31,
            /*      0x32     */              0x32,
            /*      0x33     */              0x33,
            /*      0x34     */              0x34,
            /*      0x35     */              0x35,
            /*      0x36     */              0x36,
            /*      0x37     */              0x37,
            /*      0x38     */              0x38,
            /*      0x39     */              0x39,
            /*      0x3A     */              0x3A,
            /*      0x3B     */              0x3B,
            /*      0x3C     */              0x3C,
            /*      0x3D     */              0x3D,
            /*      0x3E     */              0x3E,
            /*      0x3F     */              0x3F,
            /*      0x40     */              0x40,
            /*      0x41     */              0x41,
            /*      0x42     */              0x42,
            /*      0x43     */              0x43,
            /*      0x44     */              0x44,
            /*      0x45     */              0x45,
            /*      0x46     */              0x46,
            /*      0x47     */              0x47,
            /*      Ox48     */              0x48,
            /*      0x49     */              0x49,
            /*      0x4A     */              0x4A,
            /*      0x4B     */              0x4B,
            /*      0x4C     */              0x4C,
            /*      0x4D     */              0x4D,
            /*      0x4E     */              0x4E,
            /*      0x4F     */              0x4F,
            /*      0x50     */              0x50,
            /*      0x51     */              0x51,
            /*      0x52     */              0x52,
            /*      0x53     */              0x53,
            /*      0x54     */              0x54,
            /*      0x55     */              0x55,
            /*      0x56     */              0x56,
            /*      0x57     */              0x57,
            /*      0x58     */              0x58,
            /*      0x59     */              0x59,
            /*      0x5A     */              0x5A,
            /*      0x5B     */              0x5B,
            /*      0x5C     */              0x5C,
            /*      0x5D     */              0x5D,
            /*      0x5E     */              0x5E,
            /*      0x5F     */              0x5F,
            /*      0x60     */              0x60,
            /*      0x61     */              0x61,
            /*      0x62     */              0x62,
            /*      0x63     */              0x63,
            /*      0x64     */              0x64,
            /*      0x65     */              0x65,
            /*      0x66     */              0x66,
            /*      0x67     */              0x67,
            /*      0x68     */              0x68,
            /*      0x69     */              0x69,
            /*      0x6A     */              0x6A,
            /*      0x6B     */              0x6B,
            /*      0x6C     */              0x6C,
            /*      0x6D     */              0x6D,
            /*      0x6E     */              0x6E,
            /*      0x6F     */              0x6F,
            /*      0x70     */              0x70,
            /*      0x71     */              0x71,
            /*      0x72     */              0x72,
            /*      0x73     */              0x73,
            /*      0x74     */              0x74,
            /*      0x75     */              0x75,
            /*      0x76     */              0x76,
            /*      0x77     */              0x77,
            /*      0x78     */              0x78,
            /*      0x79     */              0x79,
            /*      0x7A     */              0x7A,
            /*      0x7B     */              0x7B,
            /*      0x7C     */              0x7C,
            /*      0x7D     */              0x7D,
            /*      0x7E     */              0x7E,
            /*      0x7F     */              0x7F,
            /*      0x80     */              0xC7,
            /*      0x81     */              0xFC,
            /*      0x82     */              0xE9,
            /*      0x83     */              0xE2,
            /*      0x84     */              0xE4,
            /*      0x85     */              0xE0,
            /*      0x86     */              0xE5,
            /*      0x87     */              0xE7,
            /*      0x88     */              0xEA,
            /*      0x89     */              0xEB,
            /*      0x8A     */              0xE8,
            /*      0x8B     */              0xEF,
            /*      0x8C     */              0xEE,
            /*      0x8D     */              0xEC,
            /*      0x8E     */              0xC4,
            /*      0x8F     */              0xC5,
            /*      0x90     */              0xC9,
            /*      0x91     */              0xE6,
            /*      0x92     */              0xC6,
            /*      0x93     */              0xF4,
            /*      0x94     */              0xF6,
            /*      0x95     */              0xF2,
            /*      0x96     */              0xFB,
            /*      0x97     */              0xF9,
            /*      0x98     */              0xFF,
            /*      0x99     */              0xD6,
            /*      0x9A     */              0xDC,
            /*      0x9B     */              0xF8,
            /*      0x9C     */              0xA3,
            /*      0x9D     */              0xD8,
            /*      0x9E     */              0xD7,
            /*      0x9F     */              0x1A,
            /*      0xA0     */              0xE1,
            /*      0xA1     */              0xED,
            /*      0xA2     */              0xF3,
            /*      0xA3     */              0xFA,
            /*      0xA4     */              0xF1,
            /*      0xA5     */              0xD1,
            /*      0xA6     */              0xAA,
            /*      0xA7     */              0xBA,
            /*      0xA8     */              0xBF,
            /*      0xA9     */              0xAE,
            /*      0xAA     */              0xAC,
            /*      0xAB     */              0xBD,
            /*      0xAC     */              0xBC,
            /*      0xAD     */              0xA1,
            /*      0xAE     */              0xAB,
            /*      0xAF     */              0xBB,
            /*      0xB0     */              0x1A,
            /*      0xB1     */              0x1A,
            /*      0xB2     */              0x1A,
            /*      0xB3     */              0x1A,
            /*      0xB4     */              0x1A,
            /*      0xB5     */              0xC1,
            /*      0xB6     */              0xC2,
            /*      0xB7     */              0xC0,
            /*      0xB8     */              0xA9,
            /*      0xB9     */              0x1A,
            /*      0xBA     */              0x1A,
            /*      0xBB     */              0x1A,
            /*      0xBC     */              0x1A,
            /*      0xBD     */              0xA2,
            /*      0xBE     */              0xA5,
            /*      0xBF     */              0x1A,
            /*      0xC0     */              0x1A,
            /*      0xC1     */              0x1A,
            /*      0xC2     */              0x1A,
            /*      0xC3     */              0x1A,
            /*      0xC4     */              0x1A,
            /*      0xC5     */              0x1A,
            /*      0xC6     */              0xE3,
            /*      0xC7     */              0xC3,
            /*      0xC8     */              0x1A,
            /*      0xC9     */              0x1A,
            /*      0xCA     */              0x1A,
            /*      0xCB     */              0x1A,
            /*      0xCC     */              0x1A,
            /*      0xCD     */              0x1A,
            /*      0xCE     */              0x1A,
            /*      0xCF     */              0xA4,
            /*      0xD0     */              0xF0,
            /*      0xD1     */              0xD0,
            /*      0xD2     */              0xCA,
            /*      0xD3     */              0xCB,
            /*      0xD4     */              0xC8,
            /*      0xD5     */              0x1A,
            /*      0xD6     */              0xCD,
            /*      0xD7     */              0xCE,
            /*      0xD8     */              0xCF,
            /*      0xD9     */              0x1A,
            /*      0xDA     */              0x1A,
            /*      0xDB     */              0x1A,
            /*      0xDC     */              0x1A,
            /*      0xDD     */              0xA6,
            /*      0xDE     */              0xCC,
            /*      0xDF     */              0x1A,
            /*      0xE0     */              0xD3,
            /*      0xE1     */              0xDF,
            /*      0xE2     */              0xD4,
            /*      0xE3     */              0xD2,
            /*      0xE4     */              0xF5,
            /*      0xE5     */              0xD5,
            /*      0xE6     */              0xB5,
            /*      0xE7     */              0xFE,
            /*      0xE8     */              0xDE,
            /*      0xE9     */              0xDA,
            /*      0xEA     */              0xDB,
            /*      0xEB     */              0xD9,
            /*      0xEC     */              0xFD,
            /*      0xED     */              0xDD,
            /*      0xEE     */              0xAF,
            /*      0xEF     */              0xB4,
            /*      0xF0     */              0xAD,
            /*      0xF1     */              0xB1,
            /*      0xF2     */              0x1A,
            /*      0xF3     */              0xBE,
            /*      0xF4     */              0xB6,
            /*      0xF5     */              0xA7,
            /*      0xF6     */              0xF7,
            /*      0xF7     */              0xB8,
            /*      0xF8     */              0xB0,
            /*      0xF9     */              0xA8,
            /*      0xFA     */              0xB7,
            /*      0xFB     */              0xB9,
            /*      0xFC     */              0xB3,
            /*      0xFD     */              0xB2,
            /*      0xFE     */              0x1A,
            /*      0xFF     */              0xA0,
    };
    #endif
    
  3. Ниже приведен пример файла сборки.

    SHELL   = /bin/ksh
    CFLAGS  = $(COMPOPT) $(INCLUDE) $(DEFINES)
    INCLUDE = -I.
    COMPOPT =
    DEFINES = -D_POSIX_SOURCE -D_XOPEN_SOURCE
    CC      = /bin/xlc
    LD      = /bin/ld
    RM      = /bin/rm
     
    SRC     = 850_88591.c
    TARGET  = 850_88591
     
    ENTRY_POINT       = instantiate
     
    $(TARGET) : 
           cc -e $(ENTRY_POINT) -o $(TARGET) $(SRC) -l iconv 
     
    clean :
            $(RM) -f $(TARGET)
            $(RM) -f *.o
    

Связанная информация

Глава 16, Поддержка национальных языков, Список функций поддержки национальных языков.

Кодовые наборы - Обзор в руководстве AIX 5L Version 5.1 Kernel Extensions and Device Support Programming Concepts.

Команды iconv, uuencode и uudecode.

Функции iconv_open, iconv, iconv_close.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]