Autor Beitrag
Vera
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82

WinXP Home
Delphi 2005 Personal
BeitragVerfasst: Sa 24.12.05 10:48 
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 827



BeitragVerfasst: 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 ...

ausblenden 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 24.12.05 12:19 
Umständlich. Wie wäre es damit:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82

WinXP Home
Delphi 2005 Personal
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 827



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 82

WinXP Home
Delphi 2005 Personal
BeitragVerfasst: 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 198
Erhaltene Danke: 39


Delphi XE3 Prof.
BeitragVerfasst: 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?

ausblenden 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:

ausblenden 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).