Unicode — это универсальный стандарт кодирования символов, который пришел на смену ASCII и поддерживает все письменности мира. В отличие от ASCII, Unicode может представлять более 1 миллиона уникальных символов.
// Пример работы с Unicode в C++20
#include <iostream>
#include <string>
#include <unicode/unistr.h> // Библиотека ICU
int main() {
icu::UnicodeString ustr = u8"Привет, мир! 😊";
std::string utf8;
ustr.toUTF8String(utf8);
std::cout << utf8 << std::endl;
}
Кодировка | Байт на символ | Особенности |
---|---|---|
UTF-8 | 1-4 | Совместима с ASCII, основной для web |
UTF-16 | 2 или 4 | Используется в Java и Windows API |
UTF-32 | 4 | Фиксированный размер, прост в обработке |
const char* utf8 = u8"UTF-8 строка";
const char16_t* utf16 = u"UTF-16 строка";
const char32_t* utf32 = U"UTF-32 строка";
const wchar_t* wide = L"Широкая строка (зависит от системы)";
#include <string>
#include <codecvt> // До C++17
std::string utf8 = u8"こんにちは"; // Японское приветствие
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv;
std::u32string utf32 = conv.from_bytes(utf8);
// Подсчет символов (не байт)
size_t char_count = utf32.length();
Проблема: Разная длина символов в UTF-8 Решение: Использовать специализированные библиотеки (ICU, Boost.Locale)
Проблема: Сортировка строк Решение: Применять правила коллации (collation)
Проблема: Визуальное представление Решение: Графемные кластеры (учет комбинирующих символов)
Характеристика | ASCII | Unicode |
---|---|---|
Диапазон | 0-127 | 0-1,114,111 |
Кодировки | 1 (7-bit) | UTF-8/16/32 |
Языковая поддержка | Английский | Все языки |
Размер символа | 1 байт | 1-4 байта (UTF-8) |