Что такое Unicode?cplus-37

Unicode — это универсальный стандарт кодирования символов, который пришел на смену ASCII и поддерживает все письменности мира. В отличие от ASCII, Unicode может представлять более 1 миллиона уникальных символов.

Основные характеристики Unicode

  1. Универсальность: Поддержка всех современных и многих древних письменностей
  2. Совместимость: Первые 128 символов идентичны ASCII
  3. Многобайтность: Использует кодировки UTF-8, UTF-16, UTF-32
  4. Постоянно развивается: Последняя версия Unicode 15.1 (2023 год)

Ключевые концепции Unicode

1. Кодовые точки

  • Уникальные номера для каждого символа (U+0000 до U+10FFFF)
  • Примеры:
    • U+0041 - латинская 'A'
    • U+0410 - кириллическая 'А'
    • U+1F600 - смайлик '😀'
// Пример работы с 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;
}

2. Кодировки Unicode

КодировкаБайт на символОсобенности
UTF-81-4Совместима с ASCII, основной для web
UTF-162 или 4Используется в Java и Windows API
UTF-324Фиксированный размер, прост в обработке

3. Нормализация

  • Один символ может иметь несколько представлений
  • Формы нормализации (NFC, NFD, NFKC, NFKD)

Работа с Unicode в C++

Строковые литералы C++11 и новее

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"Широкая строка (зависит от системы)";

Пример обработки UTF-8

#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();  

Проблемы и решения

  1. Проблема: Разная длина символов в UTF-8 Решение: Использовать специализированные библиотеки (ICU, Boost.Locale)

  2. Проблема: Сортировка строк Решение: Применять правила коллации (collation)

  3. Проблема: Визуальное представление Решение: Графемные кластеры (учет комбинирующих символов)

Сравнение с ASCII

ХарактеристикаASCIIUnicode
Диапазон0-1270-1,114,111
Кодировки1 (7-bit)UTF-8/16/32
Языковая поддержкаАнглийскийВсе языки
Размер символа1 байт1-4 байта (UTF-8)

Резюмируем

  1. Unicode — это стандарт, поддерживающий все письменности мира
  2. Использует кодовые точки (U+XXXX) и различные кодировки (UTF-8/16/32)
  3. В C++ для полной поддержки нужны внешние библиотеки (ICU)
  4. UTF-8 стал де-факто стандартом для веба и межплатформенного обмена
  5. Работа с Unicode требует учета нормализации и графемных кластеров