Юникод и многобайтовая кодировка
Библиотека классов Microsoft Foundation (MFC), библиотека времени выполнения C для Visual C++и среда разработки Visual C++ включены для поддержки международного программирования. Они предоставляют:
- Поддержка стандарта Юникода в Windows. Юникод является текущим стандартом и должен использоваться каждый раз, когда это возможно. Юникод — это 16-разрядная кодировка символов, обеспечивающая достаточно кодирования для всех языков. Все символы ASCII включены в Юникод как расширенные символы.
- Поддержка многобайтового набора символов (МБ CS) с именем двойного байтового набора символов (DBCS) на всех платформах. Символы DBCS состоят из 1 или 2 байтов. Некоторые диапазоны байтов отложены для использования в качестве потенциальных байтов. Байт свинца указывает, что он и следующая байтовая байта состоят из одного 2-байтового символа. Необходимо отслеживать, какие байты являются потенциальными байтами. В отдельных многобайтовых кодировках старшие и младшие байты попадают в определенный диапазон. При перекрытии этих диапазонов может потребоваться оценить контекст, чтобы определить, работает ли данный байт в качестве байта свинца или байта следа.
- Поддержка средств, упрощающих программирование МБ CS приложений, написанных на международных рынках. При запуске в версии операционной системы Windows с поддержкой МБ CS система разработки Visual C++, включая интегрированный редактор исходного кода, отладчик и средства командной строки, полностью МБ CS. Дополнительные сведения см. в разделе МБ CS Support in Visual C++.
В этой документации МБ CS используется для описания всех поддержки многобайтовых символов, отличных от Юникода. В Visual C++МБ CS всегда означает DBCS. Наборы символов, превышающие 2 байта, не поддерживаются.
По определению набор символов ASCII представляет собой подмножество всех многобайтовых наборов символов. Во многих многобайтовых кодировках каждый символ в диапазоне от 0x00 до 0x7F совпадает с символом в кодировке ASCII, который имеет то же значение. Например, в строках символов ASCII и МБ CS символ 1 байт (‘\0’) имеет значение 0x00 и указывает завершающий символ NULL.
Как использовать юникод в c
Для поддержки строк с символами кодировок Unicode в С++ в модуле также есть еще ряд дополнительных типов строк.
- std::wstring содержит строку символов типа wchar_t
- std::u8string содержит строку символов типа char8_t (добавлена в C++20)
- std::u16string содержит строку символов типа char16_t
- std::u32string содержит строку символов типа char32_t
Например, определим переменную типа std::wstring
std::wstring text;
Ее также можно инициализировать конкретной строкой. При присвоении переменной wstring перед строкой указывается префикс L . Для определения строк других типов также применяются определенные суффиксы: u8 для u8string, u для u16string и U для u32string. Например, определим переменные этих типов
std::wstring text ; std::u8string text8; std::u16string text16 ; std::u32string text32 ;
Для вывода строки типа std::wstring применяется поток std::wcout
#include #include int main() < std::wstring text ; std::wcout
Для вывода строк остальных типов в С++ пока не определено своих типов потоков.
В остальном работа со строками этих типов аналогична работе с типом string , они могут использовать те же функции, что и тип string .
Однако стоит учитывать, что поскольку wstring использует тип символов wchar_t , то кодировка символов таких строк зависит от компилятом. На Windows обычно применяется UTF-16, соответственно строка будет состоять из 2-байтовых символов UTF-16. Но в большинстве других систем применяются 4-байтные символы UTF-32 wchar_t . На этом фоне типы u8string , u16string и u32string выглядят более предпочтительно, однако на данный момент в C++ имеется довольно ограниченная поддержка по работе с символами Unicode.
- Глава 1. Введение в С++
- Язык программирования С++
- Первая программа на Windows. Компилятор g++
- Первая программа на Windows. Компилятор Clang
- Первая программа на Windows. Компилятор Microsoft Visual C++
- Первая программа на Linux. Компилятор g++
- Первая программа на MacOS. Компилятор Clang
- Настройка параметров компиляции
- Локализация и кириллица в консоли
- Структура программы
- Переменные
- Типы данных
- Константы
- Ввод и вывод в консоли
- using. Подключение пространств имен и определение псевдонимов
- Арифметические операции
- Статическая типизация и преобразования типов
- Поразрядные операции
- Операции присваивания
- Условные выражения
- Конструкция if-else и тернарный оператор
- Конструкция switch-case
- Циклы
- Ссылки
- Массивы
- Многомерные массивы
- Массивы символов
- Введение в строки
- Что такое указатели
- Операции с указателями
- Арифметика указателей
- Константы и указатели
- Указатели и массивы
- Определение и объявление функций
- Область видимости объектов
- Параметры функции
- Передача аргументов по значению и по ссылке
- Константные параметры
- Оператор return и возвращение результата
- Указатели в параметрах функции
- Массивы в параметрах функции
- Параметры функции main
- Возвращение указателей и ссылок
- Перегрузка функций
- Рекурсивные функции
- Рекурсия на примере быстрой сортировки
- Указатели на функции
- Указатели на функции как параметры
- Тип функции
- Указатель на функцию как возвращаемое значение
- Разделение программы на файлы
- Внешние объекты
- Динамические объекты
- Динамические массивы
- unique_ptr
- shared_ptr
- Определение классов
- Конструкторы и инициализация объектов
- Управление доступом. Инкапсуляция
- Объявление и определение функций класса
- Конструктор копирования
- Константные объекты и функции
- Ключевое слово this
- Дружественные функции и классы
- Статические члены класса
- Деструктор
- Структуры
- Перечисления
- Наследование
- Управление доступом в базовых и производных классах
- Скрытие функционала базового класса
- Множественное наследование
- Виртуальные функции и их переопределение
- Преобразование типов
- Динамическое преобразование
- Особенности динамического связывания
- Чистые виртуальные функции и абстрактные классы
- Перегрузка операторов
- Операторы преобразования типов
- Оператор индексирования
- Переопределение оператора присваивания
- Пространства имен
- Вложенные классы
- Обработка исключений
- Вложенные try-catch
- Создание своих типов исключений
- Тип exception
- Типы исключений
- Шаблоны функций
- Шаблон класса
- Специализация шаблона класса
- Наследование и шаблоны классов
- Типы контейнеров
- Вектор
- Итераторы
- Операции с векторами
- Array
- List
- Forward_list
- Deque
- Стек std::stack
- Очередь std::queue
- Очередь приоритетов std::priority_queue
- Множества
- Словарь std::map
- Span
- Определение строк
- Строки с поддержкой Unicode
- Преобразование типов и строки
- Сравнение строк
- Получение подстроки и проверка начала и конца строки
- Поиск подстроки
- Изменение строки
- Операции с символами
- Программа подсчета слов
- Тип std:string_view
- rvalue
- Конструктор перемещения
- Оператор присваивания с перемещением
- Роль noexcept при перемещении
- Объекты функций
- Лямбда-выражения
- Захват внешних значений в лямбда-выражениях
- Шаблон std::function<>
- Минимальный и максимальный элементы
- Поиск элементов
- Копирование элементов
- Удаление элементов и идиома Remove-Erase Idiom
- Сортировка
- Представления. Фильтрация
- Проекция данных
- Пропуск элементов. drop_view и drop_while_view
- Извлечение диапазона элементов. take_view и take_while_view
- Цепочки представлений
- Оператор requires
- Концепты
- Выражение requires
- Ограничения типа для auto
- Базовые типы для работы с потоками
- Файловые потоки. Открытие и закрытие
- Чтение и запись текстовых файлов
- Переопределение операторов ввода и вывода
- Математические константы и операции
- Форматирование строк и функция format
- std::optional
- Управление ресурсами. Идиома RAII
- Идиома копирования и замены
- Идиома Move-and-Swap
- Первая программа в Visual Studio
- Первая программа в Qt Creator
Поддержка Юникода и многобайтовой кодировки
Некоторые языки, например японский и китайский, имеют большие наборы символов. Для поддержки программирования на этих рынках библиотека классов Microsoft Foundation (MFC) позволяет использовать два различных подхода к обработке больших наборов символов:
- Юникод, wchar_t на основе расширенных символов и строк, закодированных как UTF-16.
- Многобайтовые символьные наборы (МБ CS)char на основе однобайтовых или двойных байтовых символов и строк, закодированных в наборе символов для языкового стандарта.
Корпорация Майкрософт рекомендует библиотеки Юникода MFC для всех новых разработок.
Библиотеки МБ CS устарели в Visual Studio 2013 и Visual Studio 2015. Это больше не требуется.
Начиная с Visual Studio 2017, библиотеки МБ CS больше не рекомендуется и не создают предупреждения об отмене.Поддержка MFC строк Юникода
Вся библиотека классов MFC условно включена для символов и строк Юникода, хранящихся в широких символах в виде UTF-16. В частности, класс CString включен в Юникоде.
Эти библиотеки, отладчик и DLL-файлы используются для поддержки Юникода в MFC:
U.LIB версииMFC
UD версииMFC. LIB
MFCMверсииU.LIB
UD версииMFCM. LIB
MFCSверсииU.LIB
UD версииMFCS. LIB
UAFXCW. LIB
UAFXCWD. LIBMFCверсииU.PDB
UD версииMFC. PDB
MFCMверсииU.PDB
UD версииMFCM. PDB
MFCSверсииU.PDB
UD версииMFCS. PDB
UAFXCW. PDB
UAFXCWD. PDBU.DLL версииMFC
UD.DLL версииMFC
ВерсияMFCMU.DLL
UD.DLL версииMFCM(версия представляет номер версии файла. Например, "140" означает версию 14.0.)
CString основан на типе TCHAR данных. Если символ _UNICODE определен для сборки программы, TCHAR определяется как тип wchar_t , 16-разрядный тип кодировки символов. TCHAR В противном случае определяется как char обычная 8-разрядная кодировка символов. Таким образом, CString в Юникоде используется 16-разрядный символ. Без Юникода он состоит из символов типа char .
Чтобы завершить программирование в Юникоде приложения, необходимо также:
- _T Используйте макрос для условного кода строк литералов, которые будут переноситься в Юникод.
- При передаче строк обратите внимание на то, требуются ли аргументы функции длину символов или длину в байтах. Разница важна, если вы используете строки Юникода.
- Используйте переносимые версии функций обработки строк во время выполнения C.
- Используйте следующие типы данных для символов и указателей символов:
- Используйте место, где вы будете TCHAR использовать char .
- Используйте место, где вы будете LPTSTR использовать char*.
- Используйте место, где вы будете LPCTSTR использовать const char*. CString предоставляет оператор LPCTSTR для преобразования между CString и LPCTSTR .
CString также предоставляет конструкторы с поддержкой Юникода, операторы назначения и операторы сравнения.
Справочник по библиотеке времени выполнения определяет переносимые версии всех функций обработки строк. Дополнительные сведения см. в разделе "Интернационализация категорий".
Поддержка MFC для строк МБ CS
Библиотека классов также включена для многобайтовых наборов символов, но только для двухбайтовых наборов символов (DBCS).
В многобайтовом наборе символов символ может быть одним или 2 байтами. Если это 2 байта в ширину, его первый байт является специальным "байтом свинца", выбранным из определенного диапазона, в зависимости от используемой кодовой страницы. В совокупности свинца и "байты тропы" указывают уникальную кодировку символов.
Если символ _MBCS определен для сборки программы, введите TCHAR тип, на основе которого CString используется, сопоставляется char с . Это зависит от вас, чтобы определить, какие байты являются CString потенциальными байтами и которые являются конечными байтами. Библиотека времени выполнения C предоставляет функции, помогающие определить это.
В DBCS указанная строка может содержать все однобайтовые символы ANSI, все двубайтовые символы или комбинацию двухбайтовых символов. Для этих возможностей требуется особое внимание при анализе строк. К ним относятся CString объекты.
Сериализация строк Юникода в MFC может считывать строки Юникода и МБ CS независимо от версии запущенного приложения. Файлы данных переносятся между Юникодом и МБ CS версий программы.
CString Функции-члены используют специальные версии функций времени выполнения C или используют функции с поддержкой Юникода. Таким образом, например, если CString функция обычно вызывается strcmp , она вызывает соответствующую функцию _tcscmp универсального текста. В зависимости от того, как определены символы _MBCS и _UNICODE определены, _tcscmp сопоставляется следующим образом:
Символы Function _MBCS Определенные _mbscmp _UNICODE Определенные wcscmp Ни определенный символ strcmp Символы _MBCS и _UNICODE являются взаимоисключающими.
Сопоставления универсальных текстовых функций для всех подпрограмм обработки строк во время выполнения рассматриваются в справочнике по библиотеке времени выполнения C. Список см. в разделе "Интернационализация".
Аналогичным образом CString методы реализуются с помощью универсальных сопоставлений типов данных. Чтобы включить как МБ CS, так и Юникод, MFC используется TCHAR для char или ( LPTSTR char * или wchar_t wchar_t* ) и LPCTSTR для const char * или . const wchar_t* Они обеспечивают правильные сопоставления для МБ CS или Юникода.
Использование unicode в C
#include и использовать функции оттуда вместо обычных: strcmp() => wscmp() и т.д.
Соответственно, переменные будут не
char a[]; char b; char * c;
wchar_t a[]; wchar_t b; wchar_t * c;
Отслеживать
ответ дан 21 мая 2015 в 11:04
user6550 user6550#include #include int main()
Отслеживать
ответ дан 21 мая 2015 в 11:03
user26699 user26699При использовании русских символов вывод кракозябры. Если использовать английские - все в норме. Кодировка в редакторе стоит utf-8 без BOM
21 мая 2015 в 11:19
@Arseniy: Как подружить юникодные строки с консолью — это отдельная боль (особенно под Windows).
21 мая 2015 в 11:20Нет ли каких нибудь альтернатив юникоду, которые можно просто подружить? Интересует вывод спец символов.
21 мая 2015 в 11:26
@Arseniy, в C/C++ работа с юникод это головная боль, если не использовать сторонние библиотеки, типа ICU/iconv. Поддержка в этих языках юникода никакая, можно считать её вообще нет.
21 мая 2015 в 11:29
Смена шрифта на lucida не помогла, пробовал и через setlocale, и через wchar_t с putwchar(); выводить, не хочет кушать нормально. putwchar на русские символы ругается. Видимо придется временно отказаться от красивых иконок и вернутся к ним позже, с появлением опыта. Спасибо всем.