Здравствуйте. Имеется проблема с кодировкой в 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();
};
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости