Igor-84 Ответов: 2

Получить шестнадцатеричное значение кириллического символа C++


Есть:
wchar_t s2 = 'ж';


Что я уже пробовал:

Мне нужно поместить шестнадцатеричное значение этого символа в тип wchar_t * буфер.
То есть мне нужно получить %d0%b6 Как это сделать правильно?

Все, что мне удалось получить, это 0436 (UTF-код символа "ж").

Но каков следующий шаг?..

2 Ответов

Рейтинг:
6

Richard MacCutchan

Простая арифметика - это все, что нужно. Если вы рассматриваете два символа UTF-8 как одно шестнадцатеричное значение, то можете видеть, что разница между ними 0x0436 и 0xD0B6 является 0xCC80 Так что просто добавьте 0xCC80 к номеру Юникода и отделите два байта. Вам понадобится аналогичный расчет для символов нижнего регистра.

Однако обратите внимание, что типы wchar_t являются символами Юникода, а не UTF-8.


Rick York

На самом деле все не так просто. Однако в этом есть странная, повторяющаяся закономерность. Вот некоторые из последовательностей, чтобы показать, что я имею в виду:

Unicode            UTF-8
0000 - 007F      0000 - 007F
0080 - 00BF      C280 - C2BF
00C0 - 00FF      C380 - C3BF
0100 - 013F      C480 - C4BF
0140 - 017F      C580 - C5BF
    ...              ...
0800 - 083F      E0A080 - E0A0BF
0840 - 087F      E0A180 - E0A1BF
0880 - 08BF      E0A280 - E0A2BF
08C0 - 08FF      E0A380 - E0A3BF
    ...                ...
1000 - 103F      E18080 - E180BF
2000 - 203F      E28080 - E280BF
3000 - 303F      E38080 - E380BF

Richard MacCutchan

Согласен, но я имел в виду только буквы в русском алфавите, так как именно это, по-видимому, интересовало ОП. Я думаю, что где-то в интернете есть документ, который объясняет, как формируются последовательности UTF-8.

Igor-84

Ричард Маккатчен, Рик Йорк, спасибо!

Рейтинг:
2

Rick York

Нет никакого следующего шага. Тот является шестнадцатеричное значение символа "ж" - или 0x0436 в шестнадцатеричной системе счисления.


CPallini

Действительно, 5.

Igor-84

Rick York, CPallini, OK и как его преобразовать в %d0%b6?

Rick York

Что такое "%d0%b6" ? Я программирую уже более 30 лет и понятия не имею, что это такое. Он смутно напоминает формат printf или sprintf, но %b не является допустимым спецификатором.

Igor-84

Рик Йорк, посмотри на это: https://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024
d0b6 помечается как UTF-8(шестнадцатеричный) символа 'ж'. Но как извлечь его из 0x0436?

Rick York

Взгляните сюда : https://stackoverflow.com/questions/20419605/how-to-convert-unicode-code-points-to-utf-8-in-c