Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2011, 00:09   #1
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию Какая-то трабла с кодировкой

Приветствую Вас. Пишу программу для перевода Delphi-исходников с одного языка на другой (комментари, значения STRING и тд.) через онлайн переводчик от Google. Никак не могу понять, каким образом кодируется переменная TEXT, отправляемая в GET-запросе. С английским и русским языком все понятно, проблем не возникло, а вот с китайскими символами получилась проблема.
например, если взять китайский символ (http://sintetic.xaker.ru/Unit1.htm) (для просмотра символа нужно установить в свойствах отображения страницы кодировку - Китайская упрощенная) и вставить его в перевочик (http://translate.google.ru/), URL будет выглядеть так:

Код:
GET http://translate.google.ru/translate_a/t?client=t&text=%E8%A7%A3&hl=ru&sl=zh-CN&tl=ru&multires=1&otf=1&pc=1&ssel=3&tsel=6&sc=1
Referer: http://translate.google.ru/?hl=ru&tab=TT
User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30
Accept: */*
Accept-Encoding: gzip,deflate,sdch
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
Cookie: SID=......
Connection: keep-alive
в интернете нашел функцию для кодирования URL'а urlencode:

Код:
function urlencode (s:string):string;
var
  i,j:integer;
  utf8:utf8string;
begin
  i:=1;
  while i<=length(s) do begin
    case s[i] of
      ' ':begin
            s[i]:='+';
            inc (i);
          end;
      'a'..'z','A'..'Z','0'..'9':
        inc (i);
    else
      utf8:=UTF8Encode(s[i]); // Convert to utf-8
      delete (s,i,1);
      for j:=1 to length(utf8) do begin
        insert ('%'+IntToHex(ord(utf8[j]),2),s,i);
        inc (i,3);
      end;
    end;
  end;
  Result:=s;
end;

с другими языками прокатывает нормально а вот с китайским не получается.

то есть получается, браузер при переводе указанного выше символа выдает URL: http://translate.google.ru/translate_a/t?client=t&text=%E8%A7%A3&hl=ru&sl=zh-CN&tl=ru&multires=1&otf=1&pc=1&ssel =3&tsel=6&sc=1

А эта функция выдает URL: http://translate.google.ru/translate_a/t?client=t&text=%D0%85%D0%B2&hl=ru&sl=zh-CN&tl=ru&multires=1&otf=1&pc=1&ssel =3&tsel=6&sc=1
Помогите пожалуйста разобраться. Я уже голову сломал, не пойму никак где косяк.
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ

Последний раз редактировалось Den7656; 19.11.2011 в 04:51.
Den7656 вне форума Ответить с цитированием
Старый 19.11.2011, 04:12   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> не пойму никак где косяк

косяк в том куске говнокода, который вы нашли в тырнете. Надо просто перевести весь текст в человеческий UTF-8, а потом уже его заурленкодить.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.11.2011, 04:53   #3
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

так там же и так оно кодируется в UTF8 в строчке:
utf8:=UTF8Encode(s[i]); // Convert to utf-8
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ
Den7656 вне форума Ответить с цитированием
Старый 19.11.2011, 05:15   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

хм, говнокод таки рабочий, хоть и написан через задницу.
У меня в XE2 он выдаёт %E8%A7%A3, так что признавайтесь, какая у вас версия Дельфи, будем посмотреть.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.11.2011, 05:33   #5
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

delphi 7.
Странно, почему такое может быть...
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ
Den7656 вне форума Ответить с цитированием
Старый 19.11.2011, 05:46   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

потому, что в Дельфи 7 string — это AnsiString. Поменяйте заголовок на:

Код:
function urlencode (s:widestring):string;
должно полегчать. Если нет, значит вы как-то не так храните 解
У меня в 7 дельфи оно, после изменения заголовка, выдаёт %E8%A7%A3

По-нормальному, функция должна выглядеть примено так:

Код:
// --  --
function urlEncode(const URL: WideString): AnsiString;
var
  i: Integer;
  utf8: AnsiString;
begin
  result := '';
  utf8 := UTF8Encode(URL);
  //
  for i := 1 to length(utf8) do begin
    //
    case (utf8[i]) of

      ' ': result := result + '+';

      '0'..'1', 'A'..'Z', 'a'..'z', '-', '_': result := result + utf8[i];

      else
        result := result + '%' + AnsiString(IntToHex(byte(utf8[i]), 2));
    end;
  end;
end;
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 19.11.2011 в 05:50.
veniside вне форума Ответить с цитированием
Старый 19.11.2011, 05:58   #7
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

Не получается (
Вот исходник, почти весь мусор вычистил.
Может посмотрите в чем дело, если есть возможность и желание.
В любом случае спасибо большое.
http://programmersforum.ru/attachmen...1&d=1321667862
Вложения
Тип файла: rar _.rar (264.6 Кб, 15 просмотров)
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ
Den7656 вне форума Ответить с цитированием
Старый 19.11.2011, 06:01   #8
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

Исправил функцию на Вашу, получаю %D0%85%D0%B2.
Видимо, действительно, не так загружаю символ.
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ

Последний раз редактировалось Den7656; 19.11.2011 в 06:40.
Den7656 вне форума Ответить с цитированием
Старый 19.11.2011, 06:57   #9
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

А, ну так, "charset=GBK", это ж надо из этой китайской кодировки его сначала декодировать в человеческий юникод (UTF-16), а потом уже кормить гуглу.

В общем, в AnsiString побайтно записываете символы, для 解 первый байт (в GBK кодировке) будет BD, второй E2.

Далее, эту AnsiString перегоняем в юникод:

Код:
// --  --
function GBK2UTF16(const src: AnsiString): WideString;
var
  len: Integer;
begin
  len := length(src) shl 2;
  SetLength(result, len);
  len := MultiByteToWideChar(936, 0, PAnsiChar(src), length(src), PWideChar(result), len);
  SetLength(result, len);
end;
(936 — это майкрософтоский номер для кодировки GBK).

После этого уже передаёте её в URLEncode().
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 19.11.2011, 07:40   #10
Den7656
Форумчанин
 
Аватар для Den7656
 
Регистрация: 08.06.2011
Сообщений: 103
По умолчанию

Спасибо ОГРОМНОЕ !!!! Очень много времени на этом убил и еще не знаю сколько убил-бы... С меня +
Жизнь хорошая штука -и⊥ʎdʞ ин ʞɐʞ
Den7656 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
socket и потоки ТРАБЛА не знаю какая ! fucil Работа с сетью в Delphi 0 21.09.2011 21:14
трабла с кодировкой текста MyLastHit Общие вопросы Delphi 10 23.08.2010 17:38
трабла с idsmtp b2soft Работа с сетью в Delphi 1 20.03.2010 00:35
Трабла с Radiogroup Seran4ek Помощь студентам 7 29.11.2009 01:15
трабла с PlaySound C-мэн Win Api 2 16.11.2008 18:35