C++. Unicode. Значение литерала символа UTF-8 не может занимать больше одного модуля
char8_t h = u8'ы';
Выдаёт ошибку: "Значение литерала символа UTF-8 не может занимать больше одного модуля"
Я использую Visual Studio с MSVC со стандартом C++20.
Ответы (1 шт):
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"ы";.