Как разобраться с кодировкой в QT?

493
23 мая 2017, 04:07

Здравствуйте. Имеется проблема с кодировкой в QT Creator. К проекту подключена библиотека libcurl. На Visual Studio все работает отлично. Когда задаешь URL в коде, все хорошо. Но если УРЛ считывать с формы, то получается следующая гадость

https://site.com/path/path/index««««««««оюою

Данные считываются следующим образом

 bool form_field = false;
bool action_field = false;
bool method_field = false;
bool input_field = false;
bool name_field = false;
bool value_field = false;
bool run = false;
bool begin = false;
int leak_control;
std::vector<char> actionv;
std::stringstream actions;
for (int i = 0; i < *size; i++) {
    leak_control = *size - i;
    if (leak_control>20) {
        if (ar[i] == '<'&&ar[i + 1] == 'f'&&ar[i + 2] == 'o'&&ar[i + 3] == 'r'&&ar[i + 4] == 'm') {
            form_field = true;
            std::cout << "<form>" << std::endl;
            actionv.clear();
            login_form::action.clear();
            login_form::action.resize(0);
            login_form::flush();
        }
        if (ar[i] == '<'&&ar[i + 1] == '/'&&ar[i + 2] == 'f'&&ar[i + 3] == 'o'&&ar[i + 4] == 'r'&&ar[i + 5] == 'm'&&ar[i + 6] == '>') {
            form_field = false;
            std::cout << "</form>" << std::endl;
        }
        if (form_field) {
            std::cout << ar[i];
            //std::cout << "NAME: " << name_field << " VALUE: " << value_field << " INPUT: " << input_field << " CHAR: " << ar[i] << std::endl;
            if (ar[i] == 'a'&&ar[i + 1] == 'c'&&ar[i + 2] == 't'&&ar[i + 3] == 'i'&&ar[i + 4] == 'o'&&ar[i + 5] == 'n'&&ar[i + 6] == '=' && (ar[i + 7] == '\'' || ar[i + 7] == '\"')) {
                action_field = true;
                i = i + 7;
            }
            if (action_field && (ar[i] == ' ' || ar[i] == '>')) {
                action_field = false;
            }
            if (ar[i] == 'm'&&ar[i + 1] == 'e'&&ar[i + 2] == 't'&&ar[i + 3] == 'h'&&ar[i + 4] == 'o'&&ar[i + 5] == 'd'&&ar[i + 6] == '=' && (ar[i + 7] == '\'' || ar[i + 7] == '\"')) {
                method_field = true;
                i = i + 7;
            }
            if (method_field && (ar[i] == ' ' || ar[i] == '>' || ar[i] == '/')) {
                method_field = false;
            }
            if (ar[i] == '<'&&ar[i + 1] == 'i'&&ar[i + 2] == 'n'&&ar[i + 3] == 'p'&&ar[i + 4] == 'u'&&ar[i + 5] == 't'&&ar[i + 6] == ' ') {
                input_field = true;
            }
            if (input_field && (ar[i] == '>')) {
                std::cout << std::endl;
                input_field = false;
            }
            if (input_field&&ar[i] == 'n'&&ar[i + 1] == 'a'&&ar[i + 2] == 'm'&&ar[i + 3] == 'e'&&ar[i + 4] == '=' && (ar[i + 5] == '\'' || ar[i + 5] == '\"')) {
                name_field = true;
                value_field = false;
                run = false;
                login_form::post_line = login_form::post_line + "&";
                //i = i + 5;
            }
            if (name_field&&ar[i] == ' ') {
                name_field = false;
                run = false;
                login_form::post_line = login_form::post_line + "=";
            }
            if (input_field&&ar[i] == 'v'&&ar[i + 1] == 'a'&&ar[i + 2] == 'l'&&ar[i + 3] == 'u'&&ar[i + 4] == 'e'&&ar[i + 5] == '=' && (ar[i + 6] == '\'' || ar[i + 6] == '\"')) {
                value_field = true;
                name_field = false;
                run = false;
                //i = i + 5;
            }
            if (value_field && (ar[i] == ' ' || ar[i] == '>')) {
                value_field = false;
                run = false;
            }
            if (action_field) {
                if (ar[i] != '\"' && ar[i] != '\'') {
                    //actions << ar[i];
                    actionv.push_back(ar[i]);
                    std::cout << "AR{I}: " << ar[i] << std::endl;
                }
            }
            if (method_field)
            {
                if (ar[i] != '\"'&&ar[i] != '\'') {
                    login_form::method += ar[i];
                }
            }
            if (name_field) {
                if (ar[i] == '=') {
                    run = true;
                    i = i + 2;
                }
                if (run&&ar[i] != '\"') {
                    login_form::post_line = login_form::post_line + ar[i];
                }
                if (run && (ar[i + 1] == '\'' || ar[i + 1] == '\"')) {
                    run = false;
                }
            }
            if (value_field) {
                if (ar[i] == '=') {
                    run = true;
                    i = i + 2;
                }
                if (run&&ar[i] != '\"') {
                    login_form::post_line += ar[i];
                }
                if (run && (ar[i + 1] == '\'' || ar[i + 1] == '\"')) {
                    run = false;
                }
            }
        }
    }
}
printf("VECTOR DATA: %s", actionv.data());
login_form::action.clear();
login_form::action.resize(0);
std::cout << login_form::action.size() << std::endl;
for(int i = 0; i<actionv.size(); i++){
    login_form::action.push_back(actionv[i]);
}
login_form::action.resize(actionv.size());
login_form::action = actionv;
//login_form::post_line = login_form::post_line.right(1);
login_form::post_line = login_form::post_line.substr(1);
std::cout << "QPOST_LINE: "<< login_form::post_line;
std::cout << "QACTION: " << login_form::action.data();
content.clear();

В самом низу попытки как-то исправить ситуацию. Ничего не могу понять. Получается, что вектор становится длиннее, чем контент который в него добавлен. Как так? Подскажите пожалуйста. Может быть я чего-то не понимаю.

Добавлю, что в самом методе URL получается нормальным. Но если передать его в класс login_form, то он сразу становится искаверканым.

Код login_form:

class login_form {
private:
std::string post_line;
std::vector<char> action;
std::string method;
std::string login;
std::string password;
int content_length = 0;
public:
void composite_post_line(const char * ar, unsigned int * size);
void flush();
void set_login(std::string *login);
void set_password(std::string *password);
void calculate_content_length();
void set_url_l(char * url);
std::string ret_post_line();
std::vector<char> ret_action();
std::string ret_method();
std::string ret_login();
std::string ret_password();
std::string ret_url_l();
int ret_content_length();
};
READ ALSO
Собрать header only dll с помощью cmake

Собрать header only dll с помощью cmake

Хочу собрать dll с помощью cmakeИспользую следующий код:

331
Непонятная формула и её результат

Непонятная формула и её результат

есть задача найти значение функции

305
Ошибка в клиенте приложения

Ошибка в клиенте приложения

Использую клиент из примера http://citforumru/book/cook/winsock

326
Как узнать конфигурацию Qt

Как узнать конфигурацию Qt

Здравствуйте, есть ли способ определить какие ключи использовались в configure при сборке

390