В этом разделе описаны основные принципы использования структур и функций 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_open, iconv и iconv_close. Она построена на основе единой структуры, которая входит во все перекодировщики. Эта базовая структура инициализируется при загрузке объектного модуля перекодировщика. По окончании загрузки модуля выполняется переход на точку входа - функцию instantiate. Она инициализирует базовую структуру и возвращает базовый дескриптор перекодировщика. Этот дескриптор применяется при последующем вызове функции init, которая выделяет память под структуры данных программы. Функция init возвращает другой дескриптор, который содержит указатель на базовый дескриптор перекодировщика. Функция init выделяет память в соответствии с требованиями программы и может вызывать другие перекодировщики. Функция init предназначена для инициализации конкретного перекодировщика, в то время как instantiate является общей точкой входа.
После создания и инициализации дескриптора необходимо обеспечить работу перекодировщика, добавив необходимый код в функцию exec. Если перекодировщик выполняет преобразование по таблице, то единственное, что требуется сделать - это предоставить исходный файл в формате, удовлетворяющем требованиям утилиты genxlt, которая перекодирует символы с созданием файла в формате, совместимом со средой iconv.
В файле 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_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 выполняются следующие действия:
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 запускает функцию exec, указатель на которую передается в базовом дескрипторе.
Функция iconv_close вызывается приложением для освобождения памяти, выделенной для преобразования кодов. Функция iconv_close запускает функцию close, указатель на которую передается в базовом дескрипторе.
Этот раздел посвящен созданию перекодировщика на основе рассмотренных выше принципов. Сначала рассматриваются простые перекодировщики, а затем - более сложные. В разделе обсуждаются следующие вопросы:
В любом перекодировщике должны быть определены следующие функции:
Во внутренней структуре данных перекодировщика первым элементом должна быть базовая структура iconv. Например:
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;
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; }
#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; }
#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
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.