2017-03-02 6 views
0

Ich habe eine Zeichenfolge 'MIROKU'. Ich möchte diese Zeichenfolge in '%82l%82h%82q%82n%82j%82t' konvertieren. Im Folgenden finden Sie meine aktuelle Funktion, die ich verwendet habe, für die Umwandlung:Delphi: Konvertieren von Windows-1251 nach Shift-JIS

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) kehrt '%82%6C%82%68%82%71%82%6E%82%6A%82%74'. Ich erwarte dieses Ergebnis nicht. Ich erwarte '%82l%82h%82q%82n%82j%82t'. Gibt es Funktionen, um es richtig zu konvertieren?

+0

Ich möchte den String '** MIROKU **' in '**% 82l% 82h% 82q% 82n% 82j% 82t **' umwandeln. –

+0

Und was produziert Ihre Funktion? Bitte verbessern Sie Ihre Frage. Sie haben nicht gesagt, was Sie für den 'CodePage'-Parameter übergeben und Sie haben nicht gesagt, was Sie von der Funktion bekommen und warum ist das falsch. – gabr

+0

Was ist die Frage? Du hast keine Frage gestellt. Überhaupt. Du sagtest: "Ich möchte X machen. Das ist meine Aufgabe, X zu machen." Bitte stellen Sie eine Frage. –

Antwort

1

Was Sie sehen, ist richtig, nur nicht das, was Sie erwarten. %6C zum Beispiel ist die ASCII-Darstellung für l. So könntest du stattdessen so etwas versuchen:

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; 

Oder du könntest es so lassen wie es ist!

+0

@DavidHeffernan, danke Ihnen für Ihre Zeit, um meine Frage zu lesen. –

+0

Natürlich. Ich habe bereits akzeptiert. –

+0

Vielleicht möchten Sie auch Ihre anderen Fragen überprüfen, nachdem Sie das Akzeptieren gelernt haben. Sie müssen keine Antwort akzeptieren. Wenn Sie nicht glauben, dass eine Antwort die Frage beantwortet, akzeptieren Sie keine. http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work –