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

UrlDecode, Работа с кириллицей - C++

Восстановить пароль Регистрация
 
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
14.03.2014, 01:43     UrlDecode, Работа с кириллицей #1
Сам пишу на C#. Тут возникла задача "общания с прогой", написанной в С++ 6.0. Проблема возникла с передачей данных с русским текстом (как есть работает, но надо шифровать, поэтому заворачиваю в Base64, который как раз и неработает), при отсылке параметров решил кодировать в urlcode (например %D0%9F%D0%BE%D0%BC%D0%BE%D0%B3%D0%B8%D1%82%D0%B5%20%D0%BF%D0%BE%D0%B6%D0%B0%D0%BB%D1%83%D0%B9%D1%81%D1%82%D0%B0!!!). делаю так:


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
inline int ishex(int x)
{
    return  (x >= '0' && x <= '9')  ||
        (x >= 'a' && x <= 'f')  ||
        (x >= 'A' && x <= 'F');
}
 
int decodeUrl(const char *s, char *dec)
{
    char *o;
    const char *end = s + strlen(s);
    int c;
 
    for (o = dec; s <= end; o++) {
        c = *s++;
        if (c == '+') c = ' ';
        else if (c == '%' && (  !ishex(*s++)    ||
                    !ishex(*s++)    ||
                    !sscanf(s - 2, "%2x", &c)))
            return -1;
 
        if (dec) *o = c;
    }
 
    return o - dec;
}
Строки выше не мои, нашел - применил. Работает только с символами. Погуглить не только пробовал, но и яндексил и маэлрил и аскил - день на это убил. Хотя очень странно что решение так и не нашлось (все решения что есть с латиницей и символами работают). Написать код самому не прадставляется возможным.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 01:43     UrlDecode, Работа с кириллицей
Посмотрите здесь:

C++ Как заставить консоль писать кириллицей?
Алгоритм urldecode / urlencode C++
Base64 не работает с кириллицей в одном из случаев C++
C++ Шифрование XOR не работает с кириллицей
C++ Шифрование текста алгоритмом Виженера не работает с кириллицей
C++ Не могу найти функцию urlencode\urldecode

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 10:48  [ТС]     UrlDecode, Работа с кириллицей #2
Познакомился с функцией CharToOem(str, tmp); ( CharToOemA(str, tmp); )
Согласно описанию она перекодирует строку (массив символов) в другую кодировку, позволяющую работать с кириллицей.

Не совсем понятно в чем отличие CharToOem(str, tmp); и CharToOemA(str, tmp); - вторая кодирует в ANSI.
Но в С и так эта кодировка используется. Поправьте меня, так как я точно в чем-то ошибаюсь.

Главный вопрос не понятно как ее использовать - во всех примерах имеется уже готовая строка на русском, и эту строку преобразуют с помощью CharToOem, далее работают с ней. А ко мне приходит строка "%D0%9F%D0%BE..."

Добавлено через 19 часов 6 минут
функция CharToOem(str, tmp); тут не в тему, она может потом понадобиться, но не по этой теме.

С кириллицей код выше не работает, так как обрататывает по 2 hex символа. А кириллица кодируется 4-мя знаками (если не считать %).
Как грамотно переделать код чтобы он различал где брать 2 пары символов для одной буквы, а где пару например пробел - %20 или знак равно - %3D?

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
inline int ishex(int x)
{
    return  (x >= '0' && x <= '9')  ||
        (x >= 'a' && x <= 'f')  ||
        (x >= 'A' && x <= 'F');
}
 
int decodeUrl(const char *s, char *dec)
{
    char *o;
    const char *end = s + strlen(s);
    int c;
 
    for (o = dec; s <= end; o++) {
        c = *s++;
        if (c == '+') c = ' ';
        else if (c == '%' && (  !ishex(*s++)    ||
                    !ishex(*s++)    ||
                    !sscanf(s - 2, "%2x", &c)))
            return -1;
   //судя по всему тут надо условие типа: если символ "краказябра" (не при-
   //надлежит какому-то множеству),
   //то надо его запомнить и взять склеить со следующим...
 
        if (dec) *o = c;
    }
 
    return o - dec;
}
Yandex
Объявления
19.03.2014, 10:48     UrlDecode, Работа с кириллицей
Ответ Создать тему
Опции темы

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