На этом шаге мы рассмотрим способы интернационализации специальных символов.
При рассказе об интернационализации остался без ответа один важный вопрос: как интернационализируются специальные символы (например, символ
\n)? Класс basic_ios содержит функции widen() и narrow(), которые могут использоваться для этой цели. Например,
символ новой строки в кодировке, соответствующей формату потока данных strm, может записываться следующим об-разом:
strm.widen('\n'); // Интернационализированный символ новой строки
Символ конца строки в этой же кодировке выглядит так:
strm.widen('\0'); // Интернационализированный завершитель строк
За примером обращайтесь к реализации манипулятора endl на 482 шаге.
Функции widen() и narrow() используют объект локального контекста, а говоря точнее - фацет ctype этого объекта.
Фацет может потребоваться для преобразования символов между char и другим представлением. Например, следующее выражение
преобразует символ с типа char в объект типа char_type с использованием объекта локального контекста loc:
std::use_facet<std::ctype<char_type> >(loc).widen(c)
Замечание.
Обратите внимание на пробел между символами >. Последовательность > воспринимается компилятором как оператор сдвига, что приводит к
синтаксической ошибке.
Подробности работы с локальными контекстами и их фацетами будут представлены в следующих шагах.
На следующем шаге мы рассмотрим концепцию локального контекста.