Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Konsolenanwendung Zeichensatz (https://www.delphipraxis.net/69374-konsolenanwendung-zeichensatz.html)

Martin K 14. Mai 2006 14:43


Konsolenanwendung Zeichensatz
 
Hi,

hab mir mal mit Delphi eine Konsolenanwendung {$APPTYPE CONSOLE} gemacht.
Leider gibt es hier Probleme bei der Formatierung von Strings über WriteLn().

Anscheinend wird hier nicht der "normale" ASCII-Zeichensatz verwendet, sondern ein anderer.
z.B. hat ein ä im normalen Zeichensatz den Index #228, bei der Konsole erhalt ich ein ä über #132.

Gibt es evtl. eine einfache Umwadlung des Zeichensatzes?

Frickeldrecktuxer_TM 14. Mai 2006 15:06

Re: Konsolenanwendung Zeichensatz
 
Zitat:

Zitat von Martin K
Anscheinend wird hier nicht der "normale" ASCII-Zeichensatz verwendet, sondern ein anderer.

Stimmt, du verwendest den ANSI-Verschnitt und möchtest deine Strings vor der Ausgabe in einen weiteren proprietären Zeichensatz umwandeln, der deiner Codepage entspricht: MSDN-Library durchsuchenOemToChar und MSDN-Library durchsuchenCharToOem

Zitat:

Zitat von Martin K
z.B. hat ein ä im normalen Zeichensatz den Index #228, bei der Konsole erhalt ich ein ä über #132.

ASCII kennt keine Umlaute.

Martin K 14. Mai 2006 15:16

Re: Konsolenanwendung Zeichensatz
 
Zitat:

Zitat von Frickeldrecktuxer_TM
Zitat:

Zitat von Martin K
Anscheinend wird hier nicht der "normale" ASCII-Zeichensatz verwendet, sondern ein anderer.

Stimmt, du verwendest den ANSI-Verschnitt und möchtest deine Strings vor der Ausgabe in einen weiteren proprietären Zeichensatz umwandeln, der deiner Codepage entspricht: MSDN-Library durchsuchenOemToChar und MSDN-Library durchsuchenCharToOem

Hm, wenn ich diese beiden Funktionen verwende, wird meine Konsole gleich nach dem Ausfüren wieder beendet.
Kann man denn nicht allgemein, irgendwo am Anfang bei der Deklaration den Zeichensatz eines Strings festlegen?

Zitat:

Zitat von Frickeldrecktuxer_TM
Zitat:

Zitat von Martin K
z.B. hat ein ä im normalen Zeichensatz den Index #228, bei der Konsole erhalt ich ein ä über #132.

ASCII kennt keine Umlaute.

Hä? Seit wann denn das ???
Der ASCII-Zeichensatz besteht doch aus 256 Zeichen und da sind auch Umlaute mit dabei...
Oder liege ich jetzt vollkommen daneben?
:gruebel:

Olli 14. Mai 2006 15:22

Re: Konsolenanwendung Zeichensatz
 
Zitat:

Zitat von Martin K
Hä? Seit wann denn das ???
Der ASCII-Zeichensatz besteht doch aus 256 Zeichen und da sind auch Umlaute mit dabei...
Oder liege ich jetzt vollkommen daneben?
:gruebel:

1.) ASCII kennt nur 128 Zeichen. Der 256 Zeichen-Satz ist EASCII!
2.) Im orginal (E)ASCII sind tatsächlich keine Umlaute enthalten. Es gibt aber Codeseiten, mit denen man Umlaute reinmappen kann.

Apropos: wenn die Konsole sofort wieder geschlossen wird, riecht das eher nach einer Exception. Mglw. rufst du obige Funktionen nicht korrekt auf?

Martin K 14. Mai 2006 15:29

Re: Konsolenanwendung Zeichensatz
 
Zitat:

Zitat von Olli
1.) ASCII kennt nur 128 Zeichen. Der 256 Zeichen-Satz ist EASCII!

Das wusste ich noch gar nicht...

Zitat:

Zitat von Olli
Apropos: wenn die Konsole sofort wieder geschlossen wird, riecht das eher nach einer Exception. Mglw. rufst du obige Funktionen nicht korrekt auf?

Ich rufe sie so auf:
Delphi-Quellcode:
var s1,s2: string;

{...}
  s1 := 'ä';
  CharToOEM( PChar(s1), PChar(s2));
  WriteLn(s2);
Ist da was falsch?
Habe diese Funktionen noch nie benutzt...

Frickeldrecktuxer_TM 14. Mai 2006 15:31

Re: Konsolenanwendung Zeichensatz
 
Zitat:

Zitat von Martin K
Hm, wenn ich diese beiden Funktionen verwende, wird meine Konsole gleich nach dem Ausfüren wieder beendet.

Gibt es keine Fehlermeldung oder ähnliches? Wie wendest du denn die Funktionen an?

Zitat:

Zitat von Martin K
Kann man denn nicht allgemein, irgendwo am Anfang bei der Deklaration den Zeichensatz eines Strings festlegen?

Bei String-Konstanten würde es sich anbieten, den String im passenden Zeichensatz in den Quellcode zu legen, sofern der DCC das mitmacht. Ansonsten weiß ich nicht, ob es eine ANSI-kompatible Codepage für DOS (und somit auch cmd.exe) gibt.

Zitat:

Zitat von Martin K
Zitat:

Zitat von Frickeldrecktuxer_TM
ASCII kennt keine Umlaute.

Hä? Seit wann denn das ???

Seit Anbeginn der Zeit, ähh, seit es ASCII gibt ;-)

Zitat:

Zitat von Martin K
Der ASCII-Zeichensatz besteht doch aus 256 Zeichen und da sind auch Umlaute mit dabei...
Oder liege ich jetzt vollkommen daneben?

ASCII sind 128 Zeichen. Welche das sind, kannst du in jeder zweitklassigen ASCII-Tabelle nachschlagen, die bei 0x7F aufhört, oder in einer Unicode-Referenz, falls du eine hast, denn die ASCII-Zeichen sind identisch mit den 128 ersten Unicode-Zeichen. Unter DOS hat man für 8bittige Zeichen Codepages eingeführt, nach Bedarf an diakritischen Zeichen (Akzente, Umlaute und was sonst noch kreucht und fleucht). Unter Windows dann eben ANSI (mittlerweile geht der Trend aber wohl auch unter Windows in Richtung Unicode, zumindest beim Dateisystem). Mit ASCII in Reinform kommst du normalerweise seit 20 Jahren nicht mehr in Berührung.

Frickeldrecktuxer_TM 14. Mai 2006 15:33

Re: Konsolenanwendung Zeichensatz
 
Zitat:

Zitat von Martin K
Ist da was falsch?

Ja. Beide Funktionen verlangen, daß der Zielpuffer groß genug ist. Dein s2 hat aber die Länge 0 (Null, nicht O), weil du die Variable zuvor noch nicht gebraucht hast. Ein passendes SetLength() auf den String sollte für Abhilfe sorgen, denn das allokiert hinreichend viel Speicher im String.

Martin K 14. Mai 2006 15:34

Re: Konsolenanwendung Zeichensatz
 
Zitat:

Zitat von Frickeldrecktuxer_TM
Zitat:

Zitat von Martin K
Kann man denn nicht allgemein, irgendwo am Anfang bei der Deklaration den Zeichensatz eines Strings festlegen?

Bei String-Konstanten würde es sich anbieten, den String im passenden Zeichensatz in den Quellcode zu legen, sofern der DCC das mitmacht. Ansonsten weiß ich nicht, ob es eine ANSI-kompatible Codepage für DOS (und somit auch cmd.exe) gibt.

Und wie geht das? :gruebel:

//Edit:
dieses elende quote-Zeug's... Ich hasse es!

Martin K 14. Mai 2006 15:42

Re: Konsolenanwendung Zeichensatz
 
Okay, so geht's:
Delphi-Quellcode:
{...}
  s1 := 'ä';
  SetLength(s2, Length(s1));
  CharToOEM( PChar(s1), PChar(s2));
  WriteLn(s2);
Aber ich würde es gerne mit der anderen Methode machen, dass die Strings im Quellcode direkt im DOS-Zeichensatz formatiert sind.
Also wenn ich eingebe:
Delphi-Quellcode:
  WriteLn('ä');
...dann soll das auch so in der Ausgabe meiner Konsole richtig stehen...

Olli 14. Mai 2006 15:42

Re: Konsolenanwendung Zeichensatz
 
SetLength benutzen.

Sorry, war kein roter Kasten da.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:36 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz