以这字符串为例:企独粤穗分字第004410号
Delphi的编码结果:
%C6%F3%B6%C0%D4%C1%CB%EB%B7%D6%D7%D6%B5%DA%30%30%34%34%31%30%BA%C5

%C6%F3%B6%C0%D4%C1%CB%EB%B7%D6%D7%D6%B5%DA004410%BA%C5
而c#的UrlEncode编码的结果则是:
%e4%bc%81%e7%8b%ac%e7%b2%a4%e7%a9%97%e5%88%86%e5%ad%97%e7%ac%ac004410%e5%8f%b7c#的UrlDecode函数不能解码Delphi的编码结果。我试过用浏览器编码,发现结果跟c#一样的,跟DELPHI的不同,有谁知道是为什么吗?谁有符合c#标准的delphi的UrlEncode函数?

解决方案 »

  1.   

    ->企独粤穗分字第004410号
    ->转为UTF8
    E4BC81E78BACE7B2A4E7A997E58886E5AD97E7ACAC303034343130E58FB7再添加 % 分割就是了吧
      

  2.   

    uses
      idUri;ShowMessage(TIdURI.PathEncode( UTF8Encode('企独粤穗分字第004410号')));
      

  3.   

    Delphi5的,没有id组件,还可以怎样做?
      

  4.   

    自己在下INDY的這個代碼,寫個函數來解決。
      

  5.   

    function UrlEncode(const ASrc: string): string;
    const
      UnsafeChars = '*#%<>+ []';  {do not localize}
    var
      i: Integer;
    begin
      Result := '';    {Do not Localize}
      for i := 1 to Length(ASrc) do begin
        if (AnsiPos(ASrc[i], UnsafeChars) > 0) or (ASrc[i]< #32) or (ASrc[i] > #127) then begin
          Result := Result + '%' + IntToHex(Ord(ASrc[i]), 2);  {do not localize}
        end else begin
          Result := Result + ASrc[i];
        end;
      end;
    end;
    ShowMessage(UrlEncode( UTF8Encode('企独粤穗分字第004410号')));
      

  6.   


    UTF8Encode这个函数包含的那个单元里?
      

  7.   

    function UnicodeToUtf8(Dest: PAnsiChar; MaxDestBytes: Cardinal; Source: PWideChar; SourceChars: Cardinal): Cardinal;
    var
      i, count: Cardinal;
      c: Cardinal;
    begin
      Result := 0;
      if Source = nil then Exit;
      count := 0;
      i := 0;
      if Dest <> nil then
      begin
        while (i < SourceChars) and (count < MaxDestBytes) do
        begin
          c := Cardinal(Source[i]);
          Inc(i);
          if c <= $7F then
          begin
            Dest[count] := Char(c);
            Inc(count);
          end
          else if c > $7FF then
          begin
            if count + 3 > MaxDestBytes then
              break;
            Dest[count] := Char($E0 or (c shr 12));
            Dest[count+1] := Char($80 or ((c shr 6) and $3F));
            Dest[count+2] := Char($80 or (c and $3F));
            Inc(count,3);
          end
          else //  $7F < Source[i] <= $7FF
          begin
            if count + 2 > MaxDestBytes then
              break;
            Dest[count] := Char($C0 or (c shr 6));
            Dest[count+1] := Char($80 or (c and $3F));
            Inc(count,2);
          end;
        end;
        if count >= MaxDestBytes then count := MaxDestBytes-1;
        Dest[count] := #0;
      end
      else
      begin
        while i < SourceChars do
        begin
          c := Integer(Source[i]);
          Inc(i);
          if c > $7F then
          begin
            if c > $7FF then
              Inc(count);
            Inc(count);
          end;
          Inc(count);
        end;
      end;
      Result := count+1;  // convert zero based index to byte count
    end;function Utf8Encode(const WS: WideString): AnsiString;
    var
      L: Integer;
      Temp: UTF8String;
    begin
      Result := '';
      if WS = '' then Exit;
      SetLength(Temp, Length(WS) * 3); // SetLength includes space for null terminator  L := UnicodeToUtf8(PAnsiChar(Temp), Length(Temp)+1, PWideChar(WS), Length(WS));
      if L > 0 then
        SetLength(Temp, L-1)
      else
        Temp := '';
      Result := Temp;
    end;
      

  8.   

    Temp: UTF8String;
    ----------------------------------
    这个UTF8String是什么?编译不通过啊
      

  9.   

    哦,原来是Temp: UTF8String; 
    很感谢僵哥的热心,但不知道僵哥试过没有,反正我得出的结果跟delphi的UrlEncode函数得出的结果是一样的,是%C6%F3%B6%C0%D4%C1%CB%EB%B7%D6%D7%D6%B5%DA004410%BA%C5跟C#的还是不一样。
      

  10.   

    url中文文件名问题解决,但有些电脑还是打不开(若是英文还是打得开)