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
Gausi: Delphi-Tags hinzugefügt.
mael - Mi 15.02.06 16:34
Vera 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).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!