- •Зачем нужны кодировки символов?
- •Си. Представление символов
- •Задания
- •Кроме латиницы Функция setlocale
- •Задания
- •Приложение 1. Управляющие символы
- •Управляющие коды в Си (эскейп-последовательности)
- •Приложение 2. Расширенная ascii таблица
- •Кодовая страница
- •Альтернативная кодировка
- •Windows кодировка
- •Приложение 3. Спецификаторы строки формата
Задания
Проверьте работу программы вводом символа B. Код этого символа равен 66.
По введенному символу получите следующий символ и его код. Не забывайте, что тип char – это числовой тип.
Разработайте вариант программы, выводящий код введенного символа в шестнадцатеричном и восьмеричном представлениях. (Указание: воспользуйтесь материалом Приложения 3)
Для символов, составляющих слово SUM, выведите сумму их кодов.
Для введенной прописной латинской буквы получите разность между кодом этой буквы и кодом буквы ‘A’.
Напишите программу, которая выведет четвертую, четырнадцатую и двадцать четвертую букву латинского алфавита.
Напишите программу, которая выведет подряд четыре буквы латинского алфавита, начиная с заданной буквы.
По введенной прописной латинской букве получите соответствующую строчную букву и ее код.
По введенной строчной латинской букве получите соответствующую прописную букву и ее код.
По введенной цифре получите ее код и разность между этой цифрой и нулем.
По введенной цифре, отличной от нуля и девяти, получите предыдущую и следующую цифру.
Для двух введенных цифр выведите их сумму (как сумму однозначных чисел) и сумму их кодов. Например, для цифр 5 и 6 их сумма равна 11, а сумма их кодов равна 107.
Попробуйте напечатать как символ число больше 255. Что получается?
Рекомендую к чтению материалы из Викиучебника — Язык Си в примерах
Кроме латиницы Функция setlocale
#include <locale.h>
char *setlocale(int type, const char *locale);
Функция setlocale() позволяет получить или установить некоторые параметры, которые зависят от геополитической среды выполнения программы. Если указатель locale является нулем, функция setlocale() возвращает указатель на строку текущей локализации. В противном случае функция setlocale() попытается использовать строку locale для установки локальных параметров в соответствии с параметром type. Для задания стандартных С-параметров региональной привязки используйте строку "С", а для задания собственных параметров среды — пустую строку (""). Чтобы получить подробную информацию о строках локализации, поддерживаемых конкретным компилятором, обратитесь к документации.
Стандарт предусматривает ряд средств для поддержки письменностей, отличных от «базовой» (26-символьной) латиницы. В основе такой поддержки — два следующих понятия:
локаль — набор сведений о письменности, языке и культуре, включающий, помимо прочего, таблицы соответствия символов верхнего и нижнего регистров;
широкие символьные типы (wchar_t, wint_t; англ. wide character) — для представления ряда письменностей (например — основанных на иероглифах), а равно для представления текстов на нескольких языках, «байтового» типа char оказывается недостаточно; как следствие, в задачах, связанных с обработкой многоязычных текстов, его заменяет тип wchar_t; аналогично, в операциях ввода-вывода используется тип wint_t (и константа WEOF.)
Соответственно, в исходный вариант вносятся следующие изменения.
Появляется вызов setlocale (LC_ALL, " "), инициализирующий локаль в соответствии с текущими настройками. (По умолчанию, при запуске программы полагается setlocale (LC_ALL, "C") — установка «стандартной» локали.)[5]
Функции getwchar, towupper, putwchar заменяют соответствующие для «узких» символов (getchar, toupper, putchar.) Соответственно меняются тип (int → wint_t) и константа признака исчерпания входного потока (EOF → WEOF.)[6][7][8]
Включаются соответствующие заголовки (locale.h, wchar.h, wctype.h.)
#include <assert.h>
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
#include <wctype.h>
int
main ()
{
char *rl
= setlocale (LC_ALL, "");
assert (rl != 0);
wint_t c;
while ((c = getwchar ()) != WEOF) {
putwchar (towupper (c));
}
assert (! ferror (stdin));
return 0;
}
Отметим, впрочем, что принятые в конкретном языке правила обращения со строчными и заглавными могут оказаться сложнее простой зависимости символ → символ, предполагаемой в данном примере. Например, правила немецкого языка ставят в соответствие строчной «ß» пару заглавных — «SS» ( Straße → STRASSE), что ни коим образом не может быть реализовано функцией towupper.
