Delphi: Konverter fra Windows-1251 til Shift-JIS

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en streng 'MIROKU'. Jeg vil konvertere denne streng til '\%82l\%82h\%82q\%82n\%82j\%82t'. Nedenfor er min nuværende funktion, som jeg har brugt til konvertering:


function MyEncode(const S: string; const CodePage: Integer): string;
var
  Encoding: TEncoding;
  Bytes: TBytes;
  b: Byte;
  sb: TStringBuilder;
begin
  Encoding := TEncoding.GetEncoding(CodePage);
  try
    Bytes := Encoding.GetBytes(S);
  finally
    Encoding.Free;
  end;

  sb := TStringBuilder.Create;
  try
    for b in Bytes do begin
      sb.Append('\%');
      sb.Append(IntToHex(b, 2));
    end;
    Result := sb.ToString;
  finally
    sb.Free;
  end;
end;


MyEncode('MIROKU', 932) returnerer '\%82\%6C\%82\%68\%82\%71\%82\%6E\%82\%6A\%82\%74'. Jeg forventer ikke dette resultat. Jeg forventer '\%82l\%82h\%82q\%82n\%82j\%82t'. Er der nogen funktioner til at konvertere det korrekt?

Bedste reference


Det du ser er korrekt, bare ikke hvad du forventer. \%6C, for eksempel, er ascii-repræsentationen for l. Så du kan prøve noget i stedet her:


function MyEncode(const S: string; const CodePage: Integer): string;
var
  Encoding: TEncoding;
  Bytes: TBytes;
  b: Byte;
  sb: TStringBuilder;
begin
  Encoding := TEncoding.GetEncoding(CodePage);
  try
    Bytes := Encoding.GetBytes(S);
  finally
    Encoding.Free;
  end;

  sb := TStringBuilder.Create;
  try
    for b in Bytes do begin
      if (b in [65..90]) or (b in [97..122]) then
      begin
        sb.Append( char(b)); // normal ascii
      end  
      else
      begin
        sb.Append('\%');
        sb.Append(IntToHex(b, 2));
      end;
    end;
    Result := sb.ToString;
  finally
    sb.Free;
  end;
end;


Eller du kunne forlade det som det er!