我需要解码:
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年之前的Delphi中使用它(我使用Delphi 2006)?
答案 0 :(得分:3)
我没有Delphi 2006,所以我在Delphi 2007上测试了代码;你应该:
将带有“%”字符的字符串转换为纯UTF8字符串;
将UTF8字符串转换为Wide String(UTF8Decode);
使用日语编码将Wide String转换为Ansi String(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”字体可以提供精确(非旋转)的外观。
答案 1 :(得分:2)
IdURI单元中的Indy TIdURI类包含UrlDecode / UrlEncode函数。您可以使用Indy的最新版本(10.5.8)进行尝试,该版本具有编码参数:
class function TIdURI.URLDecode(ASrc: string; AByteEncoding: TIdTextEncoding = nil
{$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF}
): string;
答案 2 :(得分: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'));
答案 3 :(得分:1)
mjn可能是正确的,但我强烈建议如果你要在Delphi中处理任何类型的Unicode,试着说服你的老板升级到最新版本的Delphi(或者只是Delphi 2009)。 Delphi 2009中的Unicode支持非常好,只需开箱即用。如果你真的无法做到这一点,那么TNT components对我们有用,但最后我们只是等待Delphi 2009的问世,因为从Borland开箱即可让它变得简单得多。