2011-01-29 66 views
3

我需要解碼:如何在2009年之前解碼Delphi中包含日文字符的url?

file://localhost/G:/test/%E6%B0%97%E3%81%BE%E3%81%90%E3%82%8C%E3%83%AD%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF.mp3 

file://localhost/G:/test/気まぐれロマンティック.mp3 

如何做到這一點在2009年之前,德爾福(我使用德爾福2006年)?

+0

我已經找到了解決辦法,我得到了一個指針的位置: http://www.delphigroups.info/2/5/209620.html然後在httpApp.pas中試驗httpDecode,解決方案是:TntEdit2.Text:= UTF8Decode(HTTPDecode('file:// localhost/G:/ test /%E6%B0%97%E3%81%BE%E3%81%90%E3%82%8C%E3%83%AD%E3%83%9E%E3%83%B3%E3%83%86% E3%82%A3%E3%83%83%E3%82%AF.mp3' )); – Irwan 2011-01-29 12:46:38

回答

2

IdURI單元中的Indy TIdURI類包含UrlDecode/UrlEncode函數。你可以與最近印的版本(10.5.8),其中有編碼參數試試吧:

class function TIdURI.URLDecode(ASrc: string; AByteEncoding: TIdTextEncoding = nil 
    {$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF} 
): string; 
1

MJN可能是正確的,但我會強烈建議,如果你將要處理任何類型的Unicode在Delphi中,嘗試說服你的老闆升級到最新版本的Delphi(或者僅僅是Delphi 2009)。德爾福2009年的Unicode支持非常好,並且可以直接使用。如果你真的不能這樣做,TNT components爲我們工作,但最終我們只是等待德爾福2009年出來,因爲它是從Borland開箱即用更簡單。

+1

直到64位編譯出來:-) – Irwan 2011-01-29 12:56:13

3

我沒有Delphi 2006,所以我測試了Delphi 2007上的代碼;您應該:

將帶有「%」字符的字符串轉換爲純UTF8字符串;

將UTF8字符串轉換爲寬字符串(UTF8Decode);

轉換寬字符串到ANSI字符串與日本編碼(調用WideCharToMultiByte):

const 
    SrcStr = 'file://localhost/G:/test/%E6%B0%97%E3%81%BE%E3%81%90%E3%82%8C%E3%83%AD%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF.mp3'; 

function Src2Utf8(const S: string): string; 
var 
    I: Integer; 
    S1: string; 
    B: Byte; 

begin 
    I:= 0; 
    Result:= ''; 
    SetLength(S1, 3); 
    S1[1]:= '$'; 
    while I < Length(S) do begin 
    Inc(I); 
    if S[I] <> Char('%') then Result:= Result + S[I] 
    else begin 
     Inc(I); 
     S1[2]:= S[I]; 
     Inc(I); 
     S1[3]:= S[I]; 
     B:= StrToInt(S1); 
     Result:= Result + Char(B); 
    end; 
    end; 
end; 


procedure TForm8.Button1Click(Sender: TObject); 
var 
    S: WideString; 
    S1: string; 

begin 
    S:= Utf8Decode(Src2Utf8(SrcStr)); 
    SetLength(S1, 4 * Length(S)); // more than enough 
    FillChar(PChar(S1)^, Length(S1), 0); 
    WideCharToMultiByte(932 {shift-jis codepage}, 0, PWideChar(S), Length(S), 
     PChar(S1), Length(S1), nil, nil); 
    S1:= PChar(S1); // to remove ending zeroes 
    Label1.Caption:= S1; 
end; 

當我測試上面的代碼具有不同的字體從字體與名字從「@」開始日本人符號出現旋轉90度與問題的日文字符串相比逆時針方向。帶有SHIFTJIS_CHARSET的「Arial Unicode MS」字體給出精確(非旋轉)的外觀。

2

我已經找到了解決辦法,我來到這裏的指針:delphigroups.info/2/5/209620.html然後在httpApp.pas HttpDecode實驗,解決的辦法是:

TntEdit2.Text := UTF8Decode(HTTPDecode('file://localhost/G:/test/%E6%B0%97%E3%81%BE%E3%81%90%E3%82%8C%E3%83%AD%E3%83%9E%E3%83%B3%E3%83%86%E3%82%A3%E3%83%83%E3%82%AF.mp3')); 
相關問題