Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19

Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно?

31.07.2014, 18:49. Показов 2014. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здрасьте всем!

Пришлось перелезть из Борланда на MS Visual Studio 5 под Windows XP.
Делаю маленький Веб сервер. Так вот надо декодировать приходящие запросы из %-го вида в обычный тип char*.
Поискал по инету - куча ссылок, но нет реальных конверторов. Может у кого-то есть готовый? Буду премного благодарен... У Майкрософта есть функции, которые вроде делают эту работу: UrlEncode / UrlDecode, но не могу до них добраться.

Добавлено через 4 часа 57 минут
Видимо все по отпускам разъехались...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.07.2014, 18:49
Ответы с готовыми решениями:

URL-encoded конвертер туда и обратно
Есть куча декодеров которые могут перевести непонятную белебурду, как...

Что-то не так с Encoding данных туда и обратно: byte в string и обратно в byte
Добрый день, коллеги! Столкнулся с такой проблемой, причём заметил её не сразу ("вроде бы всё работало"). В общем сразу к...

Как к case подключить модуль, вывести туда массив, преобразовать, и вернуть обратно?
есть программа с меню. В пункте №1 нужно ввести матрицу вручную В пункте №2 нужно ввести матрицу из текстового файла В пункте №3...

10
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
01.08.2014, 14:20
Лучший ответ Сообщение было отмечено ЯМалыш как решение

Решение

Я сделал сам функцию конвертации символов =)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
char ci[66][2]={"а", "А", "б", "Б", "в", "В", "г", "Г", "д", "Д", "е", "Е", "ё", "Ё", "ж", "Ж", "з", "З", "и", "И", "й", "Й", "к", "К", "л", "Л", "м", "М", "н", "Н", "о", "О",
        "п", "П", "р", "Р", "с", "С", "т", "Т", "у", "У", "ф", "Ф", "х", "Х", "ц", "Ц", "ч", "Ч", "ш", "Ш", "щ", "Щ", "ъ", "Ъ", "ы", "Ы", "ь", "Ь", "э", "Э", "ю", "Ю", "я", "Я"};
    char cd[66][7]={"%D0%B0", "%D0%90", "%D0%B1", "%D0%91", "%D0%B2", "%D0%92", "%D0%B3", "%D0%93", "%D0%B4", "%D0%94", "%D0%B5", "%D0%95", "%D1%91", "%D0%81", "%D0%B6", "%D0%96",
        "%D0%B7", "%D0%97", "%D0%B8", "%D0%98", "%D0%B9", "%D0%99", "%D0%BA", "%D0%9A", "%D0%BB", "%D0%9B", "%D0%BC", "%D0%9C", "%D0%BD", "%D0%9D", "%D0%BE", "%D0%9E",
        "%D0%BF", "%D0%9F", "%D1%80", "%D0%A0", "%D1%81", "%D0%A1", "%D1%82", "%D0%A2", "%D1%83", "%D0%A3", "%D1%84", "%D0%A4", "%D1%85", "%D0%A5", "%D1%86", "%D0%A6",
        "%D1%87", "%D0%A7", "%D1%88", "%D0%A8", "%D1%89", "%D0%A9", "%D1%8A", "%D0%AA", "%D1%8B", "%D0%AB", "%D1%8C", "%D0%AC", "%D1%8D", "%D0%AD", "%D1%8E", "%D0%AE", "%D1%8F", "%D0%AF"};
char vline[100]="";
int vci=0;
for(int i=0;i<strlen(vline);i++)
    {
        vci=0;
        while(vci < 66)
        {
            if(vline[i] == ci[vci][0])
            {
                lstrcat(line,cd[vci]);
                vci=100;
            }
            else
                vci++;
        }
        if(vci==66)
            strncat(line,vline+i,1);
    }
Типа того...
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.08.2014, 15:33
Из библиотеки pion.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
std::string url_decode(const std::string& str)
{
    char decode_buf[3];
    std::string result;
    result.reserve(str.size());
    
    for (std::string::size_type pos = 0; pos < str.size(); ++pos) {
        switch(str[pos]) {
        case '+':
            // convert to space character
            result += ' ';
            break;
        case '%':
            // decode hexidecimal value
            if (pos + 2 < str.size()) {
                decode_buf[0] = str[++pos];
                decode_buf[1] = str[++pos];
                decode_buf[2] = '\0';
                result += static_cast<char>( strtol(decode_buf, 0, 16) );
            } else {
                // recover from error by not decoding character
                result += '%';
            }
            break;
        default:
            // character does not need to be escaped
            result += str[pos];
        }
    };
    
    return result;
}
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19
01.08.2014, 19:48  [ТС]
Ур-ра!
Огромное спасибо, ребята, щас попробую оба...

Добавлено через 3 часа 57 минут
Второй пример не пойдёт: для кодировки одного символа кипиллицы исползуются пары процентных групп, так буква 'с' кодируется как %D1%81. Я не могу уловить закономерность - как они кодируют! А зная как кодируют, можно легко раскодировать. Уже 3-й день бьюсь. Это должно быть что-то до боли простое, ведь для сервера очень важна скорость обработки запроса.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
01.08.2014, 20:38
Цитата Сообщение от ЯМалыш Посмотреть сообщение
Второй пример не пойдёт
Используй мой. Я своей функцией делал парсер и всё работало.

Только единственное что, я не полностью функцию выложил, поэтому на взгляд не понятно с массивом.(ну я думаю что ты принцип понял, если так, то доделаеш за 5 минут способ "туда", а "обратно" по аналогии...)
0
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19
01.08.2014, 21:36  [ТС]
В твоём случае надо каждый раз прокручивать довольно-таки длинный цикл, до 66 витков для каждого символа... накладно. Попроьую потратить ещё денёк, если сам не разберусь с принципом, то да, возьму твой и скажу большое спасибо! А если разберусь, то поделюсь своим кодом...

Добавлено через 4 минуты
А URL-ы нынче бывают ой какие длинные... Мне попадались 2-3 КБ в длину... с кириллицей.
0
 Аватар для Izual
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
01.08.2014, 21:43
Цитата Сообщение от ЯМалыш Посмотреть сообщение
до 66 витков для каждого символа
Ну в том то и дело, что "до"(пока не стретится символ, а значит в средне статистическом будет 33). А ты думаеш что способы стандартных библиотек лучше?.. Они так же построены на циклах, либо операции преобразования и переброса функций будут съедать такое же время для поиска.

Кстати можно оптимизировать, например изменив массив, чтоб в нём шли не Большая-маленькая, а сначало одни, потом другие - тем самым можно сразу 33 цикла съэкономить.(хотя прибавится проверка на то какая это буква). Можно пойти дальше и сделать проверку на середину массива(типа средней буквы в алфавите, например из 33 букв, выбрать 16-ую и сравнить больше или меньше)... но это уже изврат. =)

Чё ты паришся, это не огромная база данных, тут даже при URL длинной в 5000 символов уйдёт даже моим методом менее секунды на преобразование.
0
28 / 23 / 12
Регистрация: 25.08.2013
Сообщений: 44
02.08.2014, 12:01
Лучший ответ Сообщение было отмечено ЯМалыш как решение

Решение

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <windows.h>
 
#include <Shlwapi.h>
#pragma comment( lib,"Shlwapi.lib" )
 
using namespace std;
 
void main()
{
  ::setlocale( NULL, "" );
 
  char url[]                 = "%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0";
  wchar_t url_w [sizeof url] = {};
  char url_a [sizeof url]    = {};
 
  cout << url << endl;
 
  ::UrlUnescapeA( url, NULL, NULL, URL_UNESCAPE_INPLACE ); // результат в utf8
 
  ::MultiByteToWideChar( CP_UTF8, 0, url, sizeof url, url_w, sizeof url );
  ::WideCharToMultiByte( 1251, 0, url_w, sizeof url_w, url_a, sizeof url_a, NULL, NULL);
 
  wcout << url_w << endl;
  cout << url_a << endl;
 
}
2
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19
02.08.2014, 12:56  [ТС]
Да, это работает, я и ожидал что-то в этом роде!
StailGot - большое спасибо!
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
02.08.2014, 13:16
Цитата Сообщение от ЯМалыш Посмотреть сообщение
Я не могу уловить закономерность - как они кодируют!
Это UTF-8 в текстовом представлении. См. тут, тут и тут.
Цитатка с вики:
For a non-ASCII character, it is typically converted to its byte sequence in UTF-8, and then each byte value is represented as above.
Добавлено через 13 минут
Например, твоя строка "%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B 0"
Нужно отбросить проценты и перевести текстовые значения в байты как есть:
Например "D1" строка будет записана в байт как 0xD1, строка 81 будет записана как 0x81 и т.д.
Итого у нас получаются такие байты, не забываем ноль в конце.
C++
1
char str[] = { 0xD1,0x81,0xD1,0x82,0xD1,0x80,0xD0,0xB0,0xD0,0xBD,0xD0,0xB0, 0 };
Теперь осталось только натравить какой-либо алгоритм преобразования в удобную нам кодировку (под Linux родная кодировка utf-8, поэтому там можно больше ничего не делать). Как это приспособить для общего случая теперь, надеюсь, сам сможешь написать - код довольно простой.
1
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19
07.08.2014, 18:33  [ТС]
Только сейчас заметил этот коммент, он помог разобраться - спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.08.2014, 18:33
Помогаю со студенческими работами здесь

Формат \u туда и обратно
Добрый день. Вопрос такой: есть некий текст формата \u, необходимо его перевести в нормальный вид (международный). Java 8 и старше....

Смена владельца:туда и обратно
Здравствуйте! У меня такая проблема: чтобы получить доступ к рабочему столу другого компа я подключил его жесткий к себе и сменил...

Архивирование программным путем (туда, обратно)
Помогите надо программным путем с архивировать файл, а затем при надобности раз архивировать. Зарание спасибо.

Движение окружности по диагонали туда и обратно
Вот написал функцию. Что не правильно в алгоритме? void move () { int shag=1; if (x&lt;getmaxx()-r &amp;&amp; y&lt;getmaxy()-r) ...

Полоса загрузки, двигающаяся туда-обратно
надо сделать полосу загрузки, но не показывающую процент загрузки а просто ездиющую туда оттуда, только необходимо что бы во время работы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника Номенклатура по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника Сотрудники по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru