Thema: Delphi Umlaute in Windows

Einzelnen Beitrag anzeigen

Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#12
  Alt 2. Okt 2002, 20:29
Hi Chris,

tja, weiß auch nicht so recht. Manchmal sind Fehler da, obwohl angeblich keiner sie sieht oder es nicht zugibt. Bis ich bei Borland anrief habe ich lange in meinem Programm gesucht. Wäre heute noch dran.

Da ich ein Freund möglichst einfacher Dinge bin, ich meine jetzt beim Programmieren , habe ich erst mal die Spur von Daniel bis zum Ende verfolgt. Dein Spezialgebiet und auch das von Luckie ist mir ein Greuel.

Vorweg : das klappt so schon einwandfrei. Aber auch in Daniels Code sind zwei kleine Fehler. Die erkläre ich zum Schluß, weil sie vor allem Anfänger womöglich tagelang aufhalten. Muß ja nicht sein.

Hier nochmal der (modifizierte) Code :
Code:
function AnsiToIBMAscii(s: string): string;
var
  i: integer;
  Result : string;
begin
  Result := '';
  for i := 1 to Length(s) do
  begin
    case s[ii] of
      #196: Result := Result + #142; (* Ä *)
      #214: Result := Result + #153; (* Ö *)
      #220: Result := Result + #154; (* Ü *)
      #228: Result := Result + #132; (* ä *)
      #246: Result := Result + #148; (* ö *)
      #252: Result := Result + #129; (* ü *)
      #223: Result := Result + #225; (* ß *)
    else
      Result := Result + s[i];
    end;
  end;
  AnsiToIBMAscii := Result;
end;

function IBMAsciiToAnsi(s: string): string;
var
  i: integer;
  Result : string;
begin
  Result := '';
  for i := 1 to Length(s) do
  begin
    case s[ii] of
      #142: Result := Result + #196; (* Ä *)
      #153: Result := Result + #214; (* Ö *)
      #154: Result := Result + #220; (* Ü *)
      #132: Result := Result + #228; (* ä *)
      #148: Result := Result + #246; (* ö *)
      #129: Result := Result + #252; (* ü *)
      #225: Result := Result + #223; (* ß *)
    else
      Result := Result + s[i];
    end;
  end;
  IBMAsciiToAnsi := Result;
end;
Der erste Fehler ist mit bloßem Auge zu erkennen : Die Variable Result war in dem alten Code nicht innerhalb der Funktion deklariert. Wer die beiden Fu. also benutzt kriegt hoffentlich einen Compiler-Fehler. Nicht schlimm, aber wenn dieser Fehler NICHT kommt, dann ist die Var. globaler deklariert und da ihr ein Wert INNERHALB der Funktion zugewiesen wird, wird dieser somit "verbogen". Da ist Gefahr im Verzug.

Der zweite Fehler liegt in der FOR-Schleife. Die soll vom ERSTEN bis zum letzten Buchstaben des strings laufen. In der Ursprungsfassung fing sie aber bei 0 schon an. Dadurch wurde in meiner DB bei jedem string-Feld ein komisches 1. Zeichen eingefügt, das auch noch gleich war und das letzte wurde abgeschnitten (Platz für 30 Zeichen nicht 31 !). Das war das Längenbyte in s [0]. Das braucht man aber nicht mitzuschleppen, Da Result := '' am Anfang steht. Direkt darauf zugreifen sollte man sowieso nicht.

Gruß
Hansa
  Mit Zitat antworten Zitat