Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];

Вниз

GET-запрос в формате UTF-8   Найти похожие ветки 

 
leonidus   (2008-08-06 19:52) [0]

Делаю GET-запрос через INDY к сервису Google Translation, строка запроса:

"http://translate.google.com/translate_t?text="+rq+"&langpair=de|ru"

где rq - переменная, содержащая немецкое слово, сама rq это widestring, ее я беру из TNT-компонента поддерживающего юникод. Но данные на сервер нужно отправлять в UTF-8, в связи с чем вопрос, как widestring сконвертировать в формат UTF-8 пригодный для вставки в URL-запрос?


 
Viktorious ©   (2008-08-07 00:20) [1]

System.pas:

{ WideString <-> UTF8 conversion }

function UTF8Encode(const WS: WideString): UTF8String;
function UTF8Decode(const S: UTF8String): WideString;


Хинт: одна из самых полезных кнопок в Делфи - это F1 ;)


 
Slym ©   (2008-08-07 12:28) [2]

procedure TForm1.Button2Click(Sender: TObject);
var
 Data:TStringList;
 res:string;
begin
 Data:=TStringList.Create;
 try
   Data.Values["text"]:=UTF8Encode(WideString("ру"));
   res:=IdHTTP1.Post("http://translate.google.com/translate_t",Data);
 finally
   Data.Free;
 end;
end;



 
leonidus   (2008-08-07 13:26) [3]

Viktorious спасибо за наводку, но при ближайшем рассмотрении оказалось что UTF8 не всегда корректно принимается скриптом, по всей вероятности запрос должен состоять из HEX-кодов каждой буквы с добавлением перед каждым кодом знак %.

Делаю так:

function CharToHex( c: widechar ): string;
begin
  Result := "%" + IntToHex( Ord( c ), 2 );
end;

text:=trim(TntMemo1.Text);  //в text
Text_hex:="";
for i:=1 to length(text) do
 Text_hex:=Text_hex+CharToHex(text[i]);

try
 st:="";
 st:=IdHTTP1.Get("http://translate.google.com/translate_t?text="+Text_hex+"&langpair=de|ru");
except
end;
//парсим
p1:=ansipos("<div id=result_box",st);
st:=copy(st,p1,length(st));
p1:=ansipos(">",st);
p2:=ansipos("</div>",st);
res:=copy(st,p1+1,p2-p1-1);
TntMemo2.Text:=res;

так вот если переводить с английского на русский например "hello" то на выходе получаю "ъДТБЧУФЧХКФЕ" что означает "Здравствуйте". А если с немецкого на русский слово "W&#246;rterbuch", то получаю "&#1057;&#1083;&#1086;&#1074;&#1072;&#1088;&#1100;" что вроде похоже на "словарь", но вопрос, почему для разных входных языков кодировка русского разная и как в обоих случаях ее привести к читаемому виду?


 
leonidus   (2008-08-07 14:54) [4]

Удалено модератором


 
leonidus   (2008-08-07 14:54) [5]

Удалено модератором


 
Alucard   (2008-08-08 01:23) [6]

Google translate принимает параметр ie, определяющий енкодинг, например, ie=UTF8. Не могу сказать, поможет ли в данном случае, но на странице сервиса он используется.


 
han_malign ©   (2008-08-08 09:15) [7]


> function CharToHex( c: widechar ): string;

RFC-1738:
  In most URL schemes, the sequences of characters in different parts
  of a URL are used to represent sequences of octets used in Internet
  protocols. For example, in the ftp scheme, the host name, directory
  name and file names are such sequences of octets, represented by
  parts of the URL.  Within those parts, an octet may be represented by
  the chararacter which has that octet as its code within the US-ASCII
  coded character set.

  In addition, octets may be encoded by a character triplet consisting
  of the character "%" followed by the two hexadecimal digits (from
  "0123456789ABCDEF") which forming the hexadecimal value of the octet.
  (The characters "abcdef" may also be used in hexadecimal encodings.)


 
Slym ©   (2008-08-08 11:32) [8]

function WideStr2UTF8URLEncode(const WStr:WideString):string;
var
 UStr:UTF8String;
 i:integer;
begin
 UStr:=UTF8Encode(WStr);
 result:="";
 if length(UStr)>0 then
   for i:=1 to length(UStr) do
     result:=result+"%"+IntToHex(ord(UStr[i]),2);
end;


 
Slym ©   (2008-08-08 11:34) [9]

leonidus   (07.08.08 13:26) [3]
И вообще чем [2] не нравится?



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2011.02.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.003 c
2-1287694639
Ллирик
2010-10-22 00:57
2011.02.27
Offset на строковую константу


11-1231103049
haword
2009-01-05 00:04
2011.02.27
Lazarus + MCK KOL + WinCE


4-1245770042
lexik
2009-06-23 19:14
2011.02.27
Иконка в Tray без окна. (Без VCL)


15-1289566593
Wc2
2010-11-12 15:56
2011.02.27
Круговое меню


2-1291121307
12
2010-11-30 15:48
2011.02.27
Запрос в потоке. Правильно пишу?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский