Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
ЯМалыш
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19
#1

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

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

Здрасьте всем!

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

Добавлено через 4 часа 57 минут
Видимо все по отпускам разъехались...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.07.2014, 18:49     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно?
Посмотрите здесь:

C++ Написать программу вычисления стоимости поездки на автомобиле на дачу ( туда и обратно)
C++ Builder Туда и Обратно(преобразование файла в 16 -й код)
C++ В диалоге лист-контрол, как в InitDialog добавить туда столбец?
Как сконвертировать AnsiString (wchar_t) to char * ? C++ Builder
C++ Как грамотно сконвертировать float в std::wstring?
Движение окружности по диагонали туда и обратно C++
Как создать окно и вывести туда картинку? C++ WinAPI
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
01.08.2014, 14:20     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Я сделал сам функцию конвертации символов =)
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);
    }
Типа того...
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
01.08.2014, 15:33     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно? #3
Из библиотеки 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
Регистрация: 17.01.2014
Сообщений: 19
01.08.2014, 19:48  [ТС]     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно? #4
Ур-ра!
Огромное спасибо, ребята, щас попробую оба...

Добавлено через 3 часа 57 минут
Второй пример не пойдёт: для кодировки одного символа кипиллицы исползуются пары процентных групп, так буква 'с' кодируется как %D1%81. Я не могу уловить закономерность - как они кодируют! А зная как кодируют, можно легко раскодировать. Уже 3-й день бьюсь. Это должно быть что-то до боли простое, ведь для сервера очень важна скорость обработки запроса.
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
01.08.2014, 20:38     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно? #5
Цитата Сообщение от ЯМалыш Посмотреть сообщение
Второй пример не пойдёт
Используй мой. Я своей функцией делал парсер и всё работало.

Только единственное что, я не полностью функцию выложил, поэтому на взгляд не понятно с массивом.(ну я думаю что ты принцип понял, если так, то доделаеш за 5 минут способ "туда", а "обратно" по аналогии...)
ЯМалыш
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19
01.08.2014, 21:36  [ТС]     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно? #6
В твоём случае надо каждый раз прокручивать довольно-таки длинный цикл, до 66 витков для каждого символа... накладно. Попроьую потратить ещё денёк, если сам не разберусь с принципом, то да, возьму твой и скажу большое спасибо! А если разберусь, то поделюсь своим кодом...

Добавлено через 4 минуты
А URL-ы нынче бывают ой какие длинные... Мне попадались 2-3 КБ в длину... с кириллицей.
Izual
93 / 118 / 6
Регистрация: 13.11.2012
Сообщений: 1,537
01.08.2014, 21:43     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно? #7
Цитата Сообщение от ЯМалыш Посмотреть сообщение
до 66 витков для каждого символа
Ну в том то и дело, что "до"(пока не стретится символ, а значит в средне статистическом будет 33). А ты думаеш что способы стандартных библиотек лучше?.. Они так же построены на циклах, либо операции преобразования и переброса функций будут съедать такое же время для поиска.

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

Чё ты паришся, это не огромная база данных, тут даже при URL длинной в 5000 символов уйдёт даже моим методом менее секунды на преобразование.
StailGot
27 / 22 / 6
Регистрация: 25.08.2013
Сообщений: 41
02.08.2014, 12:01     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно? #8
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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;
 
}
ЯМалыш
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19
02.08.2014, 12:56  [ТС]     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно? #9
Да, это работает, я и ожидал что-то в этом роде!
StailGot - большое спасибо!
DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
02.08.2014, 13:16     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно? #10
Цитата Сообщение от ЯМалыш Посмотреть сообщение
Я не могу уловить закономерность - как они кодируют!
Это 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%B0"
Нужно отбросить проценты и перевести текстовые значения в байты как есть:
Например "D1" строка будет записана в байт как 0xD1, строка 81 будет записана как 0x81 и т.д.
Итого у нас получаются такие байты, не забываем ноль в конце.
C++
1
char str[] = { 0xD1,0x81,0xD1,0x82,0xD1,0x80,0xD0,0xB0,0xD0,0xBD,0xD0,0xB0, 0 };
Теперь осталось только натравить какой-либо алгоритм преобразования в удобную нам кодировку (под Linux родная кодировка utf-8, поэтому там можно больше ничего не делать). Как это приспособить для общего случая теперь, надеюсь, сам сможешь написать - код довольно простой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2014, 18:33     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно?
Еще ссылки по теме:

C++ Сконвертировать строку в число
C++ Есть вектор пар, как положить туда значение пары через push_back
Как сконвертировать pdf в docx? C++
C++ Builder Как сделать прогресс бар туда-сюда в С++ Builder 6?
Как в OneSelectCell получить номер ячейки по которой кликнул и ввести туда текст? C++ Builder

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

Или воспользуйтесь поиском по форуму:
ЯМалыш
0 / 0 / 0
Регистрация: 17.01.2014
Сообщений: 19
07.08.2014, 18:33  [ТС]     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно? #11
Только сейчас заметил этот коммент, он помог разобраться - спасибо за помощь!
Yandex
Объявления
07.08.2014, 18:33     Как сконвертировать URL вида %D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B0 туда и обратно?
Ответ Создать тему
Опции темы

Текущее время: 08:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru