Программирование >>  Операторы преобразования типа 

1 ... 212 213 214 [ 215 ] 216 217 218 ... 239


В стандартную библиотеку С++ включены специализации char tratts<> для типов char и wchar t:

namespace std {

templateo struct char traits<char>; templateo struct char tra1ts<wchar t>:

Специализация для char обычно реализуется при помощи глобальных строковых функций языка С, определяемых в файлах <cstring> и <string.h>. Примерная реализация может выглядеть так:

namespace std {

templateo struct char tra1ts<char> [ Определения типов: typedef char charetype; typedef int inttype: typedef streampos pos type; typedef streamoff off type; typedef mbstate t state type:

Функции:

static void assign(char& cl. const char& c2) [ cl = c2:

static void eq(const char& cl. const char& c2) [ return cl == c2;

static bool 1t(const charA cl, const char& c2) { return cl < c2;

static slze t lengthCconst char* s) { return strlen(s):

static int compare(const char* si. const char* s2. s1ze t n) { return memcmp(sl.s2,n);

static char* copyCchar* si. const char* s2. s1ze t n) { return (char*)memcpy(sl.s2.n);

static char* moveCchar* si. const char* s2. sl2e t n) { return (char*)memmoveCsl,s2.n);

static char* assign(char* si. size t n. char c) { return (char*)memsetCs.c.n);

static const char* f1nd(const char* s. s1ze t n.

const char& c) [ return (const char*)memchr(s.c.n-}:



static int eofO { return EOF;

static int toJnt typeCconst charS c) { return (int)Cinsigned char)c;

static char to char type(const int& i) { return (char)i;

static int not eof(const int& i) { return i!=EOF ? i : !EOF:

static bool eqjnt type(const int& il. const int& i2) { return il i2:

Реализация пользовательского класса трактовок, обеспечивающего работу со строками без учета регистра символов, приведена на с, 485.

Интернационализация специальных символов

при рассказе об интернационализации остался без ответа один важный вопрос: как интернационализируются специальные символы (например, символ \п)? Класс basic ios содержит функции widen() и narrow(), которые могут использоваться для этой цели. Например, символ новой строки в кодировке, соответствующей формату потока данных strm, может записываться следующим образом:

strm.widen(\п): Интернационализированный символ новой строки

Символ конца строки в этой же кодировке выглядит так: strm.widen(ХО): Интернационализированный завершитель строк

За примером обращайтесь к реализации манипулятора endl на с. 587.

Функции widen() и narrow() используют объект локального контекста, а говоря точнее - фацет ctype этого объекта. Фацет может потребоваться для преобразования символов между char и другим представлением (см. с. 689). Например, следующее выражение преобразует символ с типа char в объект типа char type с использованием объекта локального контекста 1ос:

std::use facet<std::ctype<char type> >(1ос).widen(c)

Подробности работы с локальными контекстами и их фацетами будут представлены далее.

Обратите внимание на пробел между сИ1Йволами >. Последовательность > воспринимается компилятором как оператор сдвига, что приводит к синтаксической ошибке.



Концепция локального контекста

Распространенный подход к интернационализации основан на использовании специальных сред, называемых локальными контекстами (locale) и инкапсулирующих национальные или культурные стандарты. Именно этот подход используется в языке С. Таким образом, в отношении интернационализации локальный контекст представляет собой набор параметров и функций, обеспечивающих поддержку национальных или культурных стандартов. В соответствии с конвенциями Х/Ореп локальный контекст используется переменной окружения с именем LANG. В зависимости от локального контекста выбираются разные форматы вещественных чисел, дат, денежных сумм и т. д.

Обычно локальный контекст определяется строкой в формате

ЯЗЫК1 30Ид1.К0Д\\

Здесь язык - обозначение языка (например, английский или немецкий), а зона - страна, географический регион или культура, в которой используется этот язык, в частности, этот квалификатор позволяет поддерживать национальные стандарты даже в том случае, если на одном языке говорят в разных странах. Квалификатор код определяет кодировку символов. Он важен, прежде всего, для азиатских стран, где один набор символов может существовать в нескольких кодировках.

В табл. 14.2 приведена подборка типичных определений локальных контекстов. Однако следует помнить, что эти строки еще не стандартизированы (так, первый символ языка может записываться в верхнем регистре). Некоторые реализации отходят от представленного формата; например, английский локальный контекст в них обозначается строкой english. В конечном счете поддержка тех или иных локальных контекстов системой зависит от реализации.

Таблица 14.2. Примеры имен локальных контекстов Имя Описание

С Используется по умолчанию: соглашения стандарта ANSI-C (английский,

7-разрядиая кодировка)

de DE Немецкий язык (Германия)

de DE.8859l Немецкий язык (Германия) с кодировкой ISO LatJn-1

de AT Немецкий язык (Авсфия)

de CH Немецкий язык (Швейцария)

en US Английский язык (США)

en GB Английский язык (Великобритания)

en AU Английский язык (Австралия)

еп СА Английский язык (Канада)

fr FR Французский язык (Франция)

POSIX и Х/Ореп - стандартные спецификации интерфейсов операционных систем.



1 ... 212 213 214 [ 215 ] 216 217 218 ... 239

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика