Рейтинг:
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