С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
#1

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

14.03.2014, 01:43. Просмотров 529. Ответов 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;
}
Строки выше не мои, нашел - применил. Работает только с символами. Погуглить не только пробовал, но и яндексил и маэлрил и аскил - день на это убил. Хотя очень странно что решение так и не нашлось (все решения что есть с латиницей и символами работают). Написать код самому не прадставляется возможным.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.03.2014, 01:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос UrlDecode, Работа с кириллицей (C++):

Работа с кириллицей в ofstream/ifstream - C++
Как сохранять русские буквы в ofstream и выводить русские буквы в через ifstream ?

Алгоритм urldecode / urlencode - C++
Есть ли у кого нить алгоритм шифровки расшифровки адреса URI?

Не могу найти функцию urlencode\urldecode - C++
Перерыл гугл, нашол одну рабочию, но она не работает с русскими символами, мб хто подскажит как можно исправить эту или где взять рабочию ...

Не работает вывод кириллицей - C++
Не знаю как сделать что бы выводилось русскими буквами! Кто знает помогите

Вывод введенного кириллицей текста - C++
Здравствуйте! Полазил по форуму и проблему простого вывода русского текста решил: помогает и setlocale(0, &quot;&quot;) и setlocale(LC_ALL,...

Запись текста в файл кириллицей - C++
Вот код #include&lt;iostream&gt; #include&lt;fstream&gt; using namespace std; int main() { setlocale(LC_ALL,&quot;Russian&quot;); ofstream...

1
Torument
0 / 0 / 1
Регистрация: 13.03.2014
Сообщений: 16
19.03.2014, 10:48  [ТС] #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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2014, 10:48
Привет! Вот еще темы с ответами:

Шифрование XOR не работает с кириллицей - C++
Проблема и никак не могу решить. Функция XOR возвращает при исходной строке &quot;съешь еще этих мягких мексиканских кактусов да выпей...

Сохранение строк с кириллицей в файлах - C++
Здорова, котаны! Есть одна проблема: когда загружаешь строку с русскими символами в файл, в самом файле и при выгрузке(через fstream),...

Base64 не работает с кириллицей в одном из случаев - C++
Есть две функции кодирования Bаse64 в разных кодировках. Например фраза &quot;Василий Иванович&quot; в первой функции выглядит так:...

Как заставить консоль писать кириллицей? - C++
Если в оператор printf вписывать русские буквы, консоль выдает полную чухню. Что надо сделать дабы это избежать?


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.