Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 [ 215 ] 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239

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 и Х/Ореп - стандартные спецификации интерфейсов операционных систем.



Имя Описание

fr CH Французский язык (Швейцария)

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

Ja.JP.Jis Японский язык (Япония) с кодировкой JIS (Japanese Industrial Standard)

jaJP.sjis Японский язык (Япония) с кодировкой Shift JIS

jaJP.ujis Японский язык (Япония) с кодировкой UNIXized JIS

ja.JP.EUC Японский язык (Япония) с кодировкой EUC (Extended Unix Code)

ko kr Корейский язык (Корея)

zh CN Китайский язык (Китай)

zhjrw Китайский язык (Тайвань)

lt LN.bit7 ISO Latin (7-разрядная кодировка)

lt LN.bit8 ISO Latin (8-разрядная кодировка)

POSIX Соглашения стандарта POSIX: английский, 7-разрядная кодировка

Несмотря на обилие имен локальных контекстов, у программ обычно не вознцг кает особых проблем с нестандартными именами! Дело в том, что информация локального контекста в той или иной форме предоставляется пользователем. Как правило, программа просто читает информацию из переменных окружения или базы данных и определяет, с какими локальными контекстами она должна работать. Таким образом, хлопоты с определением правильных имен контекстов возлагаются на пользователя. Только если программа всегда использует конкретный локальный контекст, имя этого контекста жестко кодируется в программе. Обычно в таких случаях достаточно локального контекста С, который заведомо поддерживается всеми реализациями под именем С.

Далее показано, как работать с разными локальными контекстами в программе на С++. Кроме того, описываются фацеты локальных контекстов, позволяющие задействовать конкретные варианты форматирования.

В языке С предусмотрен также механизм применения кодировок, содержащих более 256 символов. Этот механизм основан на использовании символов wchar t - синонима для одного из целочисленных типов с языковой поддержкой констант и строковых литералов в расширенной кодировке. В остальном же поддерживаются только функции преобразования между расширенной и обычной кодировками. Этот подход также был реализован в С++ с типом символов wcharj, который является вполне самостоятельным типом (в отличие от языка С). По уровню библиотечной поддержки С++ превосходит С - практически все возможности типа char доступны для wchar t (и любого другого типа, который может использоваться в качестве типа символов).

Использование локальных контекстов

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



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 [ 215 ] 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239