Как расшифровать URL, содержащий японский символ в Delphi до 2009 года? - PullRequest
3 голосов
/ 29 января 2011

Мне нужно расшифровать:

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

Как это сделать в Delphi до 2009 года (я использую Delphi 2006)?

Ответы [ 4 ]

3 голосов
/ 29 января 2011

У меня нет 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 дает точный (не повернутый) вид.

2 голосов
/ 29 января 2011

Я нашел решение, у меня есть указатель здесь: delphigroups.info / 2/5 / 209620.html , затем поэкспериментируйте с HttpDecode в httpApp.pas, решение:

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'));
2 голосов
/ 29 января 2011

Класс Indy TIdURI в модуле IdURI содержит функции UrlDecode / UrlEncode.Вы можете попробовать это с последней версией Indy (10.5.8), которая имеет параметры кодирования:

class function TIdURI.URLDecode(ASrc: string; AByteEncoding: TIdTextEncoding = nil
  {$IFDEF STRING_IS_ANSI}; ADestEncoding: TIdTextEncoding = nil{$ENDIF}
  ): string; 
1 голос
/ 29 января 2011

mjn может быть правильным, но я настоятельно советую, если вы собираетесь работать с любым видом Unicode в Delphi, попробуйте убедить своих боссов перейти на последнюю версию Delphi (или только Delphi 2009). Поддержка Unicode в Delphi 2009 очень хороша и работает из коробки. Если вы действительно не можете этого сделать, компоненты TNT сработали для нас, но в итоге мы просто подождали выхода Delphi 2009, потому что было намного проще получить его из коробки от Borland.

...