У меня нет 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 градусов против часовой стрелки по сравнению с японской строкой извопрос.Шрифт "Arial Unicode MS" с SHIFTJIS_CHARSET дает точный (не повернутый) вид.