Учет особенностей национальных языков при обработке данных может быть реализован как часть программы, которая в этом случае сможет предоставлять различные данные для разных локалей. Кроме того, в программе могут применяться различные алгоритмы обработки текстовых данных, соответствующие особенностям различных национальных языков и стандартов. Например, алгоритмы определения начала и конца слова, а также правила переноса слов различны в разных локалях. Программы, поддерживающие подобные функции, должны на этапе исполнения работать с таблицами или алгоритмами, выбираемыми на основании текущего значения локали. Для этого могут применяться следующие способы:
Это затрудняет добавление и изменение алгоритмов и таблиц. При добавлении нового алгоритма или таблицы необходима перекомпоновка всей программы.
Этот подход упрощает добавление и изменение алгоритмов и таблиц. Однако стандартного метода загрузки алгоритмов не существует. В AIX для этих целей может использоваться системный вызов load, однако программы, в которых присутствуют вызовы load не всегда можно переносить в другие системы.
Если обработку данных с учетом
национальных стандартов можно организовать с помощью таблиц, загружаемых в
соответствии со значением локали, то программа может быть реализована с
помощью стандартных функций ввода-вывода (fopen, fread,
open, read и т.д.). Таблицы должны
размещаться в каталоге, который определен в
/usr/lpp/Имя, где Имя - это имя приложения в
одной из подходящих локалей.
Алгоритмы, обеспечивающие поддержку национальных языков, хранятся в каталоге /usr/lpp/имя/%L. Здесь %L обозначает текущее значение локали для соответствующей категории.
Системный вызов load
позволяет загружать алгоритмы из объектных модулей.
Файл methods.h определяет следующую структуру:
struct Methods { int version; char *(*hyphen)(); char *(*wordbegin)(); char *(*wordend)(); } ;
Имя главной программы в примере - textpr.
Главная программа определяет, какой модуль следует загрузить, и вызывает его методы. Обратите внимание, что файл заголовка textpr.h содержит путь к загружаемому модулю. Таким образом путь, который зависит от операционной системы, можно легко изменить.
#include <stdio.h> #include <errno.h> #include "methods.h" #include "textpr.h" /* содержит путь к загружаемым объектам */
extern int errno;
main() { char libpath[PATH_MAX]; /* содержит полный путь к загружаемому объекту */ char *prefix_path=PREFIX_PATH; /* из textpr.h */ char *method=METHOD; /* из textpr.h */ int (*func)(); char *path; /* Methods */ int ver; char *p; struct Methods *md; setlocale(LC_ALL, "");
path = setlocale(LC_CTYPE, 0); /* Получить значение локали для категории LC_CTYPE */ /* Создать строку полного пути */ /* к загружаемому объекту */ strcpy(libpath, prefix_path); strcat(libpath, path); strcat(libpath, "/"); strcat(libpath, method); func = load(conv, 1, libpath); /* Загрузить объект */ if(func==NULL){ strerror(errno); exit(1); } /* вызвать методы загруженного объекта */ md =(struct Methods *) func(); /* Получить указатель на структуру методов */ ver = md->version; /* Вызывать требуемые методы */ p = (md->hyphen)(); p = (md->wordbegin)(); p = (md->wordend)(); }
Этот модуль содержит алгоритмы поддержки национальных языков. В данном примере модуль описывает методы поддержки арабского языка. Ниже приведен текст программы method.c:
#include "methods.h"
char *Arabic_hyphen(char *); char *Arabic_wordbegin(char *); char *Arabic_wordend(char *);
static struct Methods ArabicMethods= { 1, Arabic_hyphen, Arabic_wordbegin, Arabic_wordend } ;
struct Methods *start_methods() { /* инициализация методов */ return ( &ArabicMethods); }
char *Arabic_hyphen(char *string) { /* перенос для арабского языка */ return( string); } char *Arabic_wordbegin(char *string) { /* Определение начала слова для арабского языка */ return( string); } char *Arabic_wordend(char *string) { /* определение конца слова для арабского языка */ return( string); }
Этот файл заголовка определяет путь к загружаемому модулю.
#define PREFIX_PATH "/usr/lpp/textpr" /* Указан путь для системы AIX */
Глава 16, Поддержка национальных языков.