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"ы";
.