Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Искажение русского при передаче данных через XML форму на исполнение скрипту (http://forum.oszone.net/showthread.php?t=83991)

Midnight-Ghost 14-05-2007 07:23 586541

Искажение русского при передаче данных через XML форму на исполнение скрипту
 
Приветствую всех!

Помоги пожалуйста. Пишу портал на С++. Всё почти дописано, новыяснилась одна проблема: например есть форма для ввода данных о пользователе. Пользователь вбивает данные и вместо русского текста в адрессной строке появляется что-то вроде "%26%231091%3B%26%231091%3B%26%". Кодировка стоит uft8 международная. Да даже пробовал и cp1251 ставить - не помогает. В то же время помню, что видел много сайтов, где в адрессной строке фигурирует русский текст и не искажается.

Люди, кто-нить знает как устранить эту проблему?

Помогите пожалуйста! Заранее всем спасибо!

PS. Или может есть способ передать данные из формы без искажений? Я так посмотрел, что даже если где-то вырыть какая буква в какие иероглифы превращается и писать декриптовцик, а статья(добавленная через окно формы) будет в раёне там 1500 символов то это пардон не хилая нагрузка на проц сервака... А если ещё и пользователей, каторые такое добавляют много, то и сервак повиснуть может.

Вобщем помогите с рещением данной проблемы пожалуйста.

Vlad Drakula 14-05-2007 08:00 586546

Midnight-Ghost
это не есть проблема, вске так и должно быть
при отсылке информации на сервер броузер кодирует данные, а при приеме они автоматичевски декодируются
для передачи больших объемов данные есть POST параметры запроса.

1) а причем здесь XML?
2) зачем писать веб портал на С++ ? чем вас язики преднозначенные для этих целей не устроили?

Midnight-Ghost 14-05-2007 08:13 586548

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

Насчёт того, что это не есть проблема. У меня знаковый на ПХП писать пробовал. У него та же самая проблема была. Данные отправляются на сервер в вот таком "закодированном" виде и именно в этом виде он их вбивает в базу данных MySQL. Так как декодировать такую отсылку данных?

Вот собственно задача: путь даже есть форма с единственным полем ввода например, далее идёт метод POST/GET, и передаются данные на обработку части программы которая должна эти данные записать в базу данных, но не в искажённом виде. Поскольку, как среди таких иероглифов можно поиск осущесвить?

Посмотрел книку по ПХП, всё равно - принцип тот же: данные из формы идут ввиде запроса типа: http://somehost/script?name=%D0%B0%D0%B2%D0%B0%D0%B2%D1 , затем идёт анализ, берётся строка запроса, тоесть всё, что после знака "?" и идёт анализ данных. Вот скажите, наверняка ведь кто-нить это делал, как получить нормальное значение того что записано "name="?

PS. Вот даже просто из спортивного интереса проверил, если пытаться такой искажённый текст прочитать из базы данных(тоесть вывести на интернет страницу, то они такими искажёнными и выводятся). Неужели нету способа в нормальном виде получить данные?

Vlad Drakula 14-05-2007 12:58 586654

Midnight-Ghost
1) а кто вообще оанлизурует в ручную строку запроса? $_GET['name'] - вернет искомое значение!
2) что мешает все написать руками на PHP?

Midnight-Ghost 17-05-2007 05:47 587817

На PHP я не хочу писать, хотябы потому, что он идёт как OPEN SOURCE, тоесть получив такой скрипт, пользователь сможет их нагло ставить себе пачками, в то время, как в С++ ему исходников не будет. Вот в принципе главная причина. А платить за всякие энкодеры для ПХП которые ещё и системные ресурсы хавают и лаве хороших стоят - увольте

Люди, ну не знаю я, хоть башкой об стенку стучись, гляньте плиз... вот код:
Код:

char querry[1024] = "";
string query ="";
int contentLength = 0;
string lang = "";
string category = "";
string word = "";
string caption = "";

if(getenv("CONTENT_LENGTH"))

{
contentLength = atoi(getenv("CONTENT_LENGTH"));
cin.read(querry, contentLength);
query = querry;

int langlocation = query.find ( "lang=" )+5;
int langend = query.find ("&category");
lang = query.substr(langlocation, langend - langlocation);

int categorylocation = query.find ( "category=" )+9;
int categoryend = query.find ("&word");
category = query.substr(categorylocation, categoryend - categorylocation);

int wordlocation = query.find ( "word=" )+5;
int wordend = query.find ("&caption");
word = query.substr(wordlocation, wordend - wordlocation);

int captionlocation = query.find ( "caption=" )+8;
int captionend = query.find ("&");
caption = query.substr(captionlocation, captionend - captionlocation);

cout<<"Result:\n"<<lang<<"\n"<<category<<"\n"<<word<<"\n"<<caption;
}
if(query=="")
{
cout<<"<center>Space Logic Board Translator</center>";
cout<<"<table>"
    <<"<form method = \"post\">"

    <<"<tr>"
    <<"<td>Выбрать язык для редактирования:</td>"
    <<"<td><select name=\"lang\" size=\"0\"><option value=\"1\" >English</option><option value=\"rus\">Russian</option></td>"
    <<"</tr>"

    <<"<tr>"
    <<"<td>Категория:</td>"
    <<"<td><select name=\"category\" size=\"0\"><option value=\"Registration\" >Registration</option><option value=\"Main\">Main</option></td>"
    <<"</tr>"

    <<"<tr>"
    <<"<td>Переменная:</td>"
    <<"<td><input type=\"text\" name=\"word\"></td>"
    <<"</tr>"

    <<"<tr>"
    <<"<td>Перевод:</td>"
    <<"<td><input type=\"text\" name=\"caption\"></td>"
    <<"</tr>"

    <<"</table>"
    <<"<input type =\"submit\" value=\"Install Engine\"></form>";

рабочий скрипт висит тут: скрипт

Midnight-Ghost 17-05-2007 07:21 587830

PS. Кто-нибудь может посоветовать, где найти стандарты кодировок? Ну тоесть в каких кодировках какие символы чему соответствуют, чтоб тогда можно было декодировать вручную?

Vlad Drakula 17-05-2007 11:06 587905

Midnight-Ghost
нужно наверное искать на стандарты перекодирования а уже готовую библиотесную функцию!
гугль очень полезная штука если знать что искать: http://www.google.ru/search?hl=ru&q=...%B2+Google&lr=

прямо сверху очень много инвы о кодировании декодировании строк

Midnight-Ghost 17-05-2007 18:55 588069

Ну насчёт готовой функции.... это не обязательно, иначе зачем программисту мозги? Но за ссылку спасибо! Вобщем нащёл форум разработциков, которые объяснили формулу кодирования ASCII и там всего выходит 2 варианты: 1) если встречается символ "+" его заменить на пробел, если же %5D или тому похожее по формуле вычислить десятичное значение и это значение превратить в char. За минут пять написать можно. Вобщем спасибо Вам, Vlad Drakula. Думаю тему закрыть можно. Всем удачи!


Время: 15:50.

Время: 15:50.
© OSzone.net 2001-