Получить hex значение символа кириллицы c++

118
28 октября 2019, 16:00

Имеется:

char s1 = 'Ю';
wchar_t s2 = 'ж';

Необходимо в буфер char* или wchar_t* поместить hex-значение этих символов. Т.е. необходимо получить: %d0%ae и %d0%b6 Как это правильно сделать? Максимум, что удалось получить - 042E и 0436. Дальше - не знаю как...

Доп.-1: Как я получаю 0436 по символу 'ж':

wchar_t test_string[] = L"жизнь";
unsigned long ul = test_string[0];
wchar_t hex_buffer[32];
swprintf(hex_buffer, L"0%02x", ul);

В результате получаем 0436, что в таблице UTF-символов соответствует маленькой буквой "ж". Теперь необходимо получить hex-значение этого символа, опять же из таблицы - %d0%b6 в буфер wchar_t*.

Answer 1

Вам нужно преобразовать строку в UTF-8 перед тем, как получать hex-представление. Можно использовать, например, codecvt_utf8_utf16:

#include <stdio.h>
#include <tchar.h>
#include <locale.h>
#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
int _tmain(int argc, _TCHAR* argv[])
{    
    setlocale(LC_ALL,"Russian");
    wchar_t wide_str[] = L"жизнь";  
    wchar_t hex_buffer[256] = L"";
    wchar_t buf[32];
    //преобразуем строку в UTF-8
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> utf16conv;  
    auto utf8_str = utf16conv.to_bytes(wide_str);
    //преобразуем UTF-8 в hex-представление
    for(int i=0;i<utf8_str.length();i++){   
        swprintf(buf, L"%%%x",(unsigned int)(unsigned char)(utf8_str.c_str()[i]));
        wcscat(hex_buffer,buf);
    }
    wprintf(L"%s = %s\n",wide_str,hex_buffer);
    getchar();
    return 0;
}
// Результат:
//
// жизнь = %d0%b6%d0%b8%d0%b7%d0%bd%d1%8c
READ ALSO
Чтение датаграммы по частям

Чтение датаграммы по частям

Можно ли как то прочитать датаграмму из сокета по частям? Работаю с qudpsocketГрубо говоря мне нужно пустить сокет через цепочку обработчиков,...

156
Как организовать несколько циклов?

Как организовать несколько циклов?

Делаю простейшие задачиПроблема в том, что я пока не знаю, как сделать множественный цикл (т

138
Когда перегрузка операторов это плохо? [закрыт]

Когда перегрузка операторов это плохо? [закрыт]

Перегрузка операторов крайне удобная возможность языка С++Ведь можем написать:

154