Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите перекодировать 
:(
    Опции темы
dm9
Дата 27.12.2004, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Google.ru при отправке формы на сервер преобразует как-то русские символы.

Например,
абв -> %D0%B0%D0%B1%D0%B2

Вопрос. Как сделать такое преобразование на Delphi?

PM MAIL ICQ   Вверх
Alex
Дата 27.12.2004, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Код

function StrToHex(Value:   String;
                Digits:  Integer = 1;
                Prefics: String = ' '
                ): String;
// Возвращает строку, содержащую шестнадцатеричное представление
// Value с числом возвращаемых цифр Digits и разделителем между
// ними Prefics
var
i: Integer;
begin
Result:= Value;
if Length(Value) < 1 then exit;
Result:= '';
for i:= 1 to Length(Value) do begin
  try
    if not (Ord(Value[i]) in [124]) then
      Result:= Trim(Result + Prefics + IntToHex(Ord(Value[i]), Digits))
    else begin
      if Prefics = '%' then
        Result:= Result + '%0D%0A' // Переход на новую строку
      else
        Result:= Result + value[i];
    end;
  except
    Result:= Value;
  end;
end;
end;

Добавлено @ 13:20
Если честно я неуверен, что этот код идеальное решение, он был написан очень давно. Но пока он меня не подводил


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
z-END
Дата 27.12.2004, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прафесар™
****


Профиль
Группа: Комодератор
Сообщений: 3014
Регистрация: 13.3.2003
Где: Венья, Пиетари

Репутация: 11
Всего: 102



наверное по теме


--------------------
Каждый чилавек пасвоему праф...а памоему НЕТ! 

PM WWW ICQ   Вверх
dm9
Дата 27.12.2004, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Наверное, я совсем уже отупел от программирования, но решения я не нашёл.

Alex, твой код выдаёт на букву "а" код %E0, гугл же %D0%B0...
PM MAIL ICQ   Вверх
Alex
Дата 27.12.2004, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



Хм, а как же он ее так преобразует?


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
dm9
Дата 27.12.2004, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Нашёл такую штуку: http://www.linuxdoc.ru/manpages/man7/utf8.7.html

Поясните дураку, что такое UCS???
Добавлено @ 17:24
Кодировка - UTF-8. Это, вроде как, известно...
Добавлено @ 17:25
В смысле, гуглу надо давать буковки в UTF-8.

Это сообщение отредактировал(а) dm9 - 27.12.2004, 17:29
PM MAIL ICQ   Вверх
dm9
Дата 27.12.2004, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Мда... Сделал наконец.

Код
function StrToUTF (S : String) : String;
// Работает только для части таблицы (в UCS-кодировке - от 0 до 7FF). Для
// русских символов хватает.
// Как доработать - см. здесь: http://www.linuxdoc.ru/manpages/man7/utf8.7.html
// (понадобится вставить ещё пару if-ов)
var
  Buf  : LPCWSTR;
  Size : Integer;
  SW   : PWideChar;
  i    : DWord;
  W    : Word;
begin
  Result := '';
  Size := SizeOf (WideChar) * Length (S) + 1;
  GetMem (Buf, Size);
  //Сначала переходим в UCS
  SW := StringToWideChar (S, Buf, Size);
  //Затем каждый символ этой "широкой" строки переводим в UTF согласно
  //документу по вышеуказанной ссылке
  for i := 0 to Length (S)-1 do
  begin
     W := Word(SW[i]);
     if W < $7F
     then Result := Result + '%' + IntToHex (W, 2)
     else
        if W < $7FF
        then Result := Result + '%' + IntToHex (W shr 6 + $C0, 2) + '%' + IntToHex (W and $3F + $80, 2)
        else Result := Result + '%3F'; //Знак вопроса
  end;
end;

PM MAIL ICQ   Вверх
Alex
Дата 27.12.2004, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 80
Всего: 162



dm9, доделал бы до конца smile


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
dm9
Дата 27.12.2004, 18:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Ладно, сейчас сделаю smile)
PM MAIL ICQ   Вверх
dm9
Дата 27.12.2004, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Вот. Только USC здесь от 0 до FFFF, так как WideChar имеет только два байта. Если продолжать тему, кто знает, какой формат символа имеет 4 байта (полноценный USC)?

Код
{
Функция переводит строку в UTF-формат для передачи данных, например, по сети
через get-запрос. Таким образом преобразуется строка для передачи данных
поисковику google.com
Пример:
абв -> %D0%B0%D0%B1%D0%B2
abc -> %61%62%63
Примечание: те символы, которые имеют код 0-7F, могут также передаваться
непосредственно, без данного преобразования.
Конвертируются только символы, имеющие в кодировке USC код от 0 до FFFF
Также см. статью по UTF-формату: http://www.linuxdoc.ru/manpages/man7/utf8.7.html
}
function StrToUTF (S : String) : String;
var
  Buf  : LPCWSTR;
  Size : Integer;
  SW   : PWideChar;
  i    : DWord;
  W    : Word;
begin
  Result := '';
  Size := SizeOf (WideChar) * Length (S) + 1;
  GetMem (Buf, Size);
  //Сначала переходим в USC
  SW := StringToWideChar (S, Buf, Size);
  //Затем каждый символ этой "широкой" строки переводим в UTF согласно
  //документу по вышеуказанной ссылке
  for i := 0 to Length (S)-1 do
  begin
     W := Word(SW[i]);
     if W < $7F
     then Result := Result + '%' + IntToHex (W, 2)
     else
        if W < $7FF
        then Result := Result + '%' + IntToHex (W shr 6 + $C0, 2) +
                                '%' + IntToHex (W and $3F + $80, 2)
        else Result := Result + '%' + IntToHex (W shr 12 + $E0, 2) +
                                '%' + IntToHex (W shr 6 and $3F + $80, 2) +
                                '%' + IntToHex (W and $3F + $80, 2);
  end;
end;


Это сообщение отредактировал(а) dm9 - 27.12.2004, 19:14
PM MAIL ICQ   Вверх
Girder
Дата 27.12.2004, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Топик... прям под вами smile. Вот здесь... smile

Применение... для Google smile
Код
procedure TForm1.Button1Click(Sender: TObject);
var Str,Buf:string;
   i:integer;
   sCodePage,dCodePage:Dword;
begin
sCodePage:=1251; //Cyrillic (Windows)
dCodePage:=65001; //Unicode (UTF-8)
Str:='абв'; //1251 - типо твой текст
i:=Length(Str)*2+1;
SetLength(Buf,i); //65001
if ConvertStr(sCodePage,dCodePage,PChar(Str),PChar(Buf),Length(Str),i)=0 then
 begin
  Str:='';
  for i:=1 to i do Str:=Str+'%'+IntToHex(Ord(Buf[i]),2);
  Caption:=Str; //Типо ответ
 end;
end;


Удачи.

Это сообщение отредактировал(а) Girder - 27.12.2004, 20:09


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
dm9
Дата 27.12.2004, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Да ладно, ещё библиотеку с собой таскать... smile
А у меня приложение через инет распространяется smile)

Особо вникать сейчас не хочется, если честно. Скажи, а там поддерживается 4-байтный USC, многобайтный UTF (до 6 байт)?

Библиотеку буду иметь в виду smile
PM MAIL ICQ   Вверх
dm9
Дата 29.12.2004, 02:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дмитрий Копытин
****


Профиль
Группа: Vingrad developer
Сообщений: 3876
Регистрация: 22.7.2002
Где: Москва

Репутация: 6
Всего: 137



Цитата(dm9 @ 27.12.2004, 20:24)
Да ладно, ещё библиотеку с собой таскать...


Прошу прощения, сегодня понял, что здесь я стормозил. Эта библиотека входит же в состав винды smile
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1485 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.