Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Помогите перекодировать


Автор: dm9 27.12.2004, 13:11
Google.ru при отправке формы на сервер преобразует как-то русские символы.

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

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

Автор: Alex 27.12.2004, 13:16
Код

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
Если честно я неуверен, что этот код идеальное решение, он был написан очень давно. Но пока он меня не подводил

Автор: z-END 27.12.2004, 13:31
наверное по http://forum.vingrad.ru/index.php?showtopic=24398&hl=

Автор: dm9 27.12.2004, 16:30
Наверное, я совсем уже отупел от программирования, но решения я не нашёл.

Alex, твой код выдаёт на букву "а" код %E0, гугл же %D0%B0...

Автор: Alex 27.12.2004, 17:17
Хм, а как же он ее так преобразует?

Автор: dm9 27.12.2004, 17:22
Нашёл такую штуку: http://www.linuxdoc.ru/manpages/man7/utf8.7.html

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

Автор: dm9 27.12.2004, 18:27
Мда... Сделал наконец.

Код
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;

Автор: Alex 27.12.2004, 18:33
dm9, доделал бы до конца smile

Автор: dm9 27.12.2004, 18:37
Ладно, сейчас сделаю smile)

Автор: dm9 27.12.2004, 19:10
Вот. Только 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;

Автор: Girder 27.12.2004, 20:04
Топик... прям под вами smile. http://forum.vingrad.ru/index.php?act=ST&f=84&t=26951&st=0 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;


Удачи.

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

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

Библиотеку буду иметь в виду smile

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


Прошу прощения, сегодня понял, что здесь я стормозил. Эта библиотека входит же в состав винды smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)