Entwickler-Ecke

Sonstiges (Delphi) - keine Umlaute bei Konsolenanwendung


Vera - Sa 24.12.05 10:48
Titel: keine Umlaute bei Konsolenanwendung
hi ihr!

ich bin die vera und noch ganz neu hier im forum. :wave:

jetzt zu meiner frage: wenn ich eine konsolenanwendung mit delphi (Version 5) erstelle und zum Beispiel mit

writeLN ('Test ö');

einen text ausgebe, dann erscheint für den umlaut ein komisches zeichen? weiß jemand was ich machen muss damit in dem konsolenfenster auch umlaute angezeigt werden?

vielen dank und allen frohe weihnachten!!!

bye


Alstar - Sa 24.12.05 12:02

Hallo!

Ich hab mal eine CRT-Unit gecodet, die fast alle Funktionen der gleichnamigen TurboPascal-Unit drin hatte und auch ein paar Funktionen, die speziell für die Win32-Konsole angepasst sind.
Unter anderem, hab ich das normale Write[ln] durch eine Funktion ersetzt, die gleich die Umlaute konvertiert ...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
function ReplaceUmlaut(SourceString: String): String;
var
  strTemp: String;
begin
  strTemp := SourceString;

  strTemp := AnsiReplaceStr(strTemp, 'ö''”');
  strTemp := AnsiReplaceStr(strTemp, 'Ö''™');
  strTemp := AnsiReplaceStr(strTemp, 'ä''„');
  strTemp := AnsiReplaceStr(strTemp, 'Ä''Ž');
  strTemp := AnsiReplaceStr(strTemp, 'ü''');
  strTemp := AnsiReplaceStr(strTemp, 'Ü''š');
  strTemp := AnsiReplaceStr(strTemp, 'ß''á');
  strTemp := AnsiReplaceStr(strTemp, '§''õ');
  strTemp := AnsiReplaceStr(strTemp, '²''ý');
  strTemp := AnsiReplaceStr(strTemp, '³''ü');
  strTemp := AnsiReplaceStr(strTemp, '°''ø');

  Result := strTemp;
end;


Du übergibst einfach den String mit Umlauten und bekommst einen String zurürck, der die Umlaute für die Konsole beinhaltet.

Frohes Fest!

Alstar


Delete - Sa 24.12.05 12:19

Umständlich. Wie wäre es damit:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function Ansi2OEM(AnsiString: string): string;
begin
  ANSIString := ANSIString + #0;
  CharToOEM(PChar(ANSIString), @ANSIString[1]);
  Delete(ANSIString, Length(ANSIString), 1);
  Result := ANSIString;
end;


Vera - Sa 24.12.05 15:24

Danke Euch beiden für die Antworten!!!

Lukie, warum fügst du der Variable ANSIString das Zeichen #0 hinzu und warum entfernst du am Ende das letzte Zeichen? :gruebel:

danke und bye
Vera


PS: super sache, dass die eigenen themen hervorgehoben werden.


Alstar - Sa 24.12.05 15:31

Das macht er, denke ich, weil CharToOEM einen null-terminierten String erwartet. Nachher nimmt er das einfach wieder weg.
Allerdings werden bei Luckies Variante alle Zeichen konvertiert und nicht nur die Umlaute.

Alstar


Vera - Sa 24.12.05 15:40

bin halt noch sehr neu bei dem thema delphi.

warum funktioniert dann der folgende code bei mir? Also ohne #0 anzuhängen und später wieder zu löschen?


Delphi-Quelltext
1:
2:
3:
4:
function Ansi2OEM(AnsiString: string): string;
begin
  result := CharToOEM(@ANSIString[1], @ANSIString[1]);
end;


bye vera

Moderiert von user profile iconGausi: Delphi-Tags hinzugefügt.


mael - Mi 15.02.06 16:34

user profile iconVera hat folgendes geschrieben:
bin halt noch sehr neu bei dem thema delphi.

warum funktioniert dann der folgende code bei mir? Also ohne #0 anzuhängen und später wieder zu löschen?


Delphi-Quelltext
1:
2:
3:
4:
function Ansi2OEM(AnsiString: string): string;
begin
  result := CharToOEM(@ANSIString[1], @ANSIString[1]);
end;


Thread ist zwar alt, aber die Antwort:

AnsiStrings (=string) sind Hybridstrings, die sowohl ihre Länge speichern, als auch nullterminiert sind. Die #0 ist also immer am Ende vorhanden, außer der string ist leer. Daher ist es besser PChar(S) zu verwenden, da wenn der string leer ist, @S[1] auf nil zeigt (es gibt kein erstes Zeichen).

Also am Besten so:


Delphi-Quelltext
1:
2:
3:
4:
5:
function Ansi2OEM(const S: string): string;
begin
  Result := S;
  CharToOEM(PChar(Result), PChar(Result));
end;


P.S. AnsiString ist ein schlechter Variablenname da es auch ein Typ ist.
P.P.S: Das Dein Code funktioniert hat wundert mich übrigens, denn CharToOEM liefert ein BOOL zurück, daher sollte Result := CharToOem nicht funtionieren (result ist ja ein string).