C++. Unicode. Значение литерала символа UTF-8 не может занимать больше одного модуля

char8_t h = u8'ы';

Выдаёт ошибку: "Значение литерала символа UTF-8 не может занимать больше одного модуля"

Я использую Visual Studio с MSVC со стандартом C++20.


Ответы (1 шт):

Автор решения: HolyBlackCat

char8_t ведет себя примерно как unsigned char, т.е. хранит значения от 0 до 255. А символов юникода больше миллиона.

char8_t - не один символ UTF-8 (не один code point), а один code unit, т.е. один из байтов, составляющих символ (от 1 до 4 байтов на символ).

Вообще, char8_t и u8 перед строкой - не очень полезны. Все то же самое можно хранить в char.

Есть два стула варианта:

  • Можно либо хранить номер символа в char32_t или чем-то подобном, а при необходимости перекодировать в UTF-8 и обратно. char32_t ch = U'ы';.

  • Либо хранить символ в короткой строке, сразу в UTF-8. std::string ch = "ы"; или std::u8string ch = u8"ы";.

→ Ссылка