Кожен символ, який ми бачимо на екрані, зберігається в пам'яті комп'ютера як число. **Кодування символів** — це система, що встановлює відповідність між символом і його числовим кодом. **Кодова таблиця** (або набір символів) — це повний список таких відповідностей.
* **Одномірне кодування (Один байт):** *char — стандартний тип символів у C++, зазвичай займає **1 байт** (8 біт). Може зберігати 256 різних значень (від 0 до 255).
* Приклади кодових таблиць: **ASCII** (7-бітне, для латинських літер, цифр, знаків пунктуації), **ISO-8859** (розширення ASCII), **Windows-1251** (для кирилиці).
* **Багатобайтове кодування (Два або більше байтів):**
* Використовується для представлення символів з великих наборів, як-от Юнікод (Unicode), що містить символи більшості писемностей світу.
* Приклади: **UTF-8**, **UTF-16**, **UTF-32**.
Усі літери та інші символи, які використовуються для друку, кодуються двійковими числами.
Існують:
Коди всіх символів знаходяться в спеціальних таблицях і збігаються з їх порядковими номерами в цих таблицях.
В однобайтовому кодуванні (системі ASCII) закріплені дві таблиці кодування: базова (з кодами від 0 до 127) та розширена (з кодами від 128 до 255).
Базова таблиця (таблиця ASCII) однакова для всіх кодувань. У всіх задачах, які ми будемо вирішувати в цьому розділі, ми будемо використовувати лише символи з тієї таблиці.
| Код | Символ | Код | Символ | Код | Символ | Код | Символ |
|---|---|---|---|---|---|---|---|
| 0 | 32 | 64 | @ | 96 | - | ||
| 1 | ○ | 33 | ! | 65 | A | 97 | a |
| 2 | ● | 34 | " | 66 | B | 98 | b |
| 3 | ▼ | 35 | # | 67 | C | 99 | c |
| 4 | ♦ | 36 | $ | 68 | D | 100 | d |
| 5 | ♣ | 37 | % | 69 | E | 101 | e |
| 6 | ♦ | 38 | & | 70 | F | 102 | f |
| 7 | • | 39 | ' | 71 | G | 103 | g |
| 8 | ■ | 40 | ( | 72 | H | 104 | h |
| 9 | 41 | ) | 73 | I | 105 | i | |
| 10 | ✅ | 42 | * | 74 | J | 106 | j |
| 11 | ✅ | 43 | + | 75 | K | 107 | k |
| 12 | ○ | 44 | , | 76 | L | 108 | l |
| 13 | ✅ | 45 | - | 77 | M | 109 | m |
| 14 | ♫ | 46 | . | 78 | N | 110 | n |
| 15 | ☆ | 47 | / | 79 | O | 111 | o |
| 16 | ► | 48 | 0 | 80 | P | 112 | p |
| 17 | ✅ | 49 | 1 | 81 | Q | 113 | q |
| 18 | ↑ | 50 | 2 | 82 | R | 114 | r |
| 19 | !! | 51 | 3 | 83 | S | 115 | s |
| 20 | ¶ | 52 | 4 | 84 | T | 116 | t |
| 21 | § | 53 | 5 | 85 | U | 117 | u |
| 22 | — | 54 | 6 | 86 | V | 118 | v |
| 23 | ↑ | 55 | 7 | 87 | W | 119 | w |
| 24 | ↑ | 56 | 8 | 88 | X | 120 | x |
| 25 | ↓ | 57 | 9 | 89 | Y | 121 | y |
| 26 | › | 58 | : | 90 | Z | 122 | z |
| 27 | < | 59 | ; | 91 | [ | 123 | { |
| 28 | ⊥ | 60 | < | 92 | \ | 124 | | |
| 29 | < > | 61 | = | 93 | ] | 125 | } |
| 30 | ▲ | 62 | > | 94 | ^ | 126 | ~ |
| 31 | ▼ | 63 | ? | 95 | _ | 127 | ◇ |
З цієї таблиці потрібно пам'ятати тільки те, що:
Для того, щоб використовувати символи кирилиці, потрібно розглянути багато додаткової інформації (інший тип даних, інший ввід даних і т.і.)
У розширеній таблиці розташовані національні системи кодування (символи кирилиці). Відсутність єдиного стандарту у цій галузі призвела до множинності одночасно діючих кодувань.
При програмуванні на мові С++ кодування символів може відрізнятися залежно від операційної системи та налаштувань компілятора.
В C++ можна налаштувати і двобайтове кодування. Це так звані широкі символи (UTF-8).
wchar_t)Для роботи з великими наборами символів, особливо в Windows-орієнтованих додатках (UTF-16), використовується тип **широких символів**.
wchar_tТип wchar_t (від **w**ide **char**acter) — це тип, призначений для зберігання одного широкого символу. Його розмір визначається реалізацією компілятора, але часто це **2 або 4 байти** (наприклад, 2 байти для UTF-16 у Windows).
В C++11 з'явилися також більш специфічні типи:
char16_t: гарантовано 16 біт (для UTF-16).char32_t: гарантовано 32 біти (для UTF-32).Для ініціалізації широких символів використовується префікс **L** перед символом або рядком.
#include <iostream> #include <clocale> // Для встановлення локалі int main() { // Встановлення локалі для коректного виведення широких символів std::setlocale(LC_ALL, "uk_UA.UTF-8"); // Звичайний символ (1 байт) char c1 = 'A'; char c2 = 'Я'; // Може бути багатобайтовим або некоректним залежно від кодування вихідного файлу // Широкий символ (зазвичай 2 або 4 байти) wchar_t wc1 = L'A'; wchar_t wc2 = L'€'; // Символ євро const wchar_t WC_CONST = L'🚀'; // Широка константа // Широкий рядок const wchar_t* ws = L"Привіт, Світ!"; std::wcout << L"Широкий символ: " << wc2 << L"\n"; std::wcout << L"Широкий рядок: " << ws << L"\n"; std::wcout << L"Розмір wchar_t: " << sizeof(wchar_t) << L" байтів\n"; return 0; }---
Оскільки символи є просто числовими значеннями, їхній код легко отримати, виконавши явне приведення типу до цілого числа (int) або навпаки.
#include <iostream> #include <clocale> int main() { std::setlocale(LC_ALL, "uk_UA.UTF-8"); // Отримання коду символу char my_char = 'A'; wchar_t my_wchar = L'Ж'; // Символ "Ж" int char_code = (int)my_char; int wchar_code = (int)my_wchar; std::cout << "Код 'A': " << char_code << "\n"; // Напр., 65 std::wcout << L"Код 'Ж': " << wchar_code << L"\n"; // Напр., 1046 (в Unicode) // Отримання символу за кодом int code_for_B = 66; int code_for_I = 1048; // Код Unicode для 'И' char char_from_code = (char)code_for_B; wchar_t wchar_from_code = (wchar_t)code_for_I; std::cout << "Символ за кодом 66: " << char_from_code << "\n"; // B std::wcout << L"Символ за кодом 1048: " << wchar_from_code << L"\n"; // И return 0; }---
Символи (як char, так і wchar_t) можна порівнювати безпосередньо за допомогою звичайних операторів порівняння (==, !=, >, <), оскільки вони порівнюються за своїми числовими кодами.
char c1 = 'a'; char c2 = 'b'; bool is_greater = c2 > c1; // true, оскільки код 'b' > коду 'a'
char використовуйте стандартні потоки std::cin та std::cout.wchar_t використовуйте відповідні широкі потоки std::wcin та std::wcout.Стандартна бібліотека C++ пропонує набори функцій для маніпулювання символами:
| Заголовок | Функція (char) | Широка Функція (wchar_t) | Призначення |
|---|---|---|---|
<cctype> |
isalnum() |
iswalnum() |
Перевіряє, чи є символ літерою або цифрою. |
<cctype> |
islower() |
iswlower() |
Перевіряє, чи є символ малою літерою. |
<cctype> |
isupper() |
iswupper() |
Перевіряє, чи є символ великою літерою. |
<cctype> |
tolower() |
towlower() |
Перетворює символ у нижній регістр. |
<cctype> |
toupper() |
towupper() |
Перетворює символ у верхній регістр. |
#include <iostream> #include <cctype> #include <cwctype> // Для широких символів int main() { char c = 'h'; wchar_t wc = L'П'; std::cout << "toupper('h'): " << (char)toupper(c) << "\n"; // H // towupper повертає wint_t, але використовується як wchar_t std::wcout << L"towlower('П'): " << (wchar_t)towlower(wc) << L"\n"; // п return 0; }---