Entwickler-Ecke

Sonstiges (Delphi) - Chr() bei Konsolenanwendung


WeBsPaCe - Sa 16.04.05 17:18
Titel: Chr() bei Konsolenanwendung
Moin... ;)

Ich hab ein Problem beim Ausgeben eines ASCII-Codes per Chr(). Z.B. bei folgendem Programm:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i: Integer;

begin
  for i := 1 to 254 do writeln(IntToStr(i) + '   ' + chr(i));
  readln;
end.

Da zeigt er mir bei z.B. 199 ein komisches A mit Tilde drauf an. Ich bräuchte dieses Zeichen jedoch in meinem Programm... Ich denk mal, es liegt an irgendwelchen Zeichensätzen... :nixweiss:

Danke schonmal... ;)


Moderiert von user profile iconChristian S.: Topic aus Algorithmen, Optimierung und Assembler verschoben am Sa 16.04.2005 um 17:20


uall@ogc - Sa 16.04.05 17:26

man muss jetzt nicht unbedingt verstehen was du von uns willst?


WeBsPaCe - Sa 16.04.05 17:30

user profile iconuall@ogc hat folgendes geschrieben:
man muss jetzt nicht unbedingt verstehen was du von uns willst?

:rofl: Okay... Ich probier's nochmal... Per Chr() wird ja normalerweise das ASCCI-Zeichen passend zu dieser Zahl angezeigt. Also z.B. bei 109 ein kleines M. Ich schau jetzt in meine ASCCI-Tabelle rein und seh, dass bei 199 jedoch ein anderes Zeichen ist, als das das angezeigt wird. ;) Ich will aber das Zeichen haben, was in der Tabelle ist. ;)


Heiko - Sa 16.04.05 17:48

In der Konsolenanwendung wird der DOS-ASCII-Code angezeigt und nicht der Win-ASCII-Code :wink: .

Chr(199):
Win: Ç
DOS: Ã

Das Zeichen meinst du doch?


WeBsPaCe - Sa 16.04.05 17:52

Nö. :rofl:

Ich mein so einen senkrechten Doppelstrich mit einem senkrechten angebauten Strich. :lol: Ich such das Zeichen mal... ;)


Muetze1 - Sa 16.04.05 18:08

Moin!

Das sind die pseudo-grafischen Elemente der alten DOS Maschinen. Die Windows Eingabeaufforderung nutzt diesen aber nicht - sie benutzt ja einen normalen Windows Font und dieser hat dort nicht die IBM CodePage zeichen mit drinne. Wozu willst du dies Zeichen überhaupt haben? Vor allem: in einer Windows 32 GUI Anwendung oder in einer Windows 32 Konsolenanwendung.

MfG
Meutze1


WeBsPaCe - Sa 16.04.05 18:49

user profile iconMuetze1 hat folgendes geschrieben:
Das sind die pseudo-grafischen Elemente der alten DOS Maschinen. Die Windows Eingabeaufforderung nutzt diesen aber nicht - sie benutzt ja einen normalen Windows Font und dieser hat dort nicht die IBM CodePage zeichen mit drinne.

Bekomm ich das irgendwie rein?

user profile iconMuetze1 hat folgendes geschrieben:
Wozu willst du dies Zeichen überhaupt haben?

Zum Aufpeppen... ;) Sieht sonst so leer aus... ;)

user profile iconMuetze1 hat folgendes geschrieben:
Vor allem: in einer Windows 32 GUI Anwendung oder in einer Windows 32 Konsolenanwendung.

Siehe Titel... ;) :arrow: Konsolenanwendung. ;)


Heiko - Sa 16.04.05 20:01

@WeBsPaCe: Ist ein Doppelstrich oder Doppelpunkt über dem A?

Wenn es ein Doppelpunkt ist mach mal ein Screenshot davon und stell den hier rein. Würde mich mal interessieren wie ein A mit zwei Strichen darüber aussieht :wink: .


WeBsPaCe - Sa 16.04.05 20:14

Jop. Hier. ;) Ihr könnt's ja auch mal bei euch ausprobiern:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

begin
  write(chr(199));
  readln;
end.


Heiko - Sa 16.04.05 20:29

Das ist doch eindeutig Ã!!!!!!!!

Kannst du ja auch mal ausprobieren Alt drückst und währenddessen die 1 dann 9, dann nochmal die 9 drückst und dann die ALt-Taste wieder loslässt. Wenn du das z.B. in deinem Textbearbeitungsprogramm eingibst kannst du das dann sogar vergrößern um das Zeichen zu vergleichen :wink: (Ich traue es dir zu mindestens zu : wink: ). Die Eingabeaufforderung entspricht also dem DOS-ASCII-Code.


hansa - Sa 16.04.05 21:26

Ihr braucht das hier :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
function IBMAsciiToAnsi(s: string): string;
var
  i: integer;
begin
  Result := '';
  for i := 0 to Length(s) do
  begin
    case s[i] 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;
end;


Allerding ist da kein ~A dabei.


Heiko - So 17.04.05 10:13

Was hat dein Post hier groß mit dem Thema zu tun? Ich glaub hier geht es ehr um das Zeichen 199. Und das steht in deinem Quelltext nicht drin. Für was ist die Prozedur überhaupt? Es ersetzt ja nur ein paar Zeichen und nicht alle, die anders sind im Gegensatz von DOS zu Windows.


hansa - So 17.04.05 10:53

@Heiko : Ich habe doch gesagt, daß das eine Zeichen nicht dabei ist. Und was ist das :

user profile iconHeiko hat folgendes geschrieben:
In der Konsolenanwendung wird der DOS-ASCII-Code angezeigt und nicht der Win-ASCII-Code :wink: .

Chr(199):
Win: Ç
DOS: Ã



:?:

Genau das macht der Code. Du weißt ja angeblich genau, um was es geht. Also sage ihm doch einfach auch noch die Codes von ~A und fertig. 8)


delfiphan - So 17.04.05 11:16

Ansi zu Ascii8:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

Var
 Ascii, Ansi: String;
begin
 Ascii := 'äöü';
 SetLength(Ansi, length(Ascii));
 CharToOemBuff(Pointer(Ascii), Pointer(Ansi), Length(Ascii));
 Writeln('Ascii:',Ascii,' Ansi:',Ansi);
 Readln;
end.


WeBsPaCe - So 17.04.05 13:56

Also entweder ihr versteht mich nicht oder ich euch nicht... :lol: Was soll ich denn mit ANSI? Das hat doch damit gar nix zu tun?!?!? :gruebel:

Ich hab hier eine ASCII-Zeichen-Tabelle liegen auf welcher steht, dass bei Zeichen Nummer 199 das Zeichen [ :arrow: moechtichhaben.GIF ] kommen soll. Das will ich auch angezeigt bekommen. Statt dessen kommt aber folgendes Zeichen [ :arrow: bekommichangezeigt.GIF ]. Anscheinend war dieses Zeichen damals noch im ASCII-Zeichensatz mit drin und jetzt nicht mehr. Im Unicode ist aber auf jeden Fall noch, weil ich's mir bei Word hab einfügen können. ;)


delfiphan - So 17.04.05 14:02

Windows Version / benützer Font?


Heiko - So 17.04.05 14:13

Dein moechtichhaben-Zeichen bekommst du mit chr(204) laut meiner DOS-ASCII-Tabelle :wink: .


WeBsPaCe - So 17.04.05 14:15

Komisch.......... :gruebel:

Ich hab Windows XP Professional SP2
Schülerversion ( <-- dürfte aber keinen Unterschied machen)

Schriftart ist auf Rasterschriftart eingestellt. Aber auch bei Lucida Console ist's so... :nixweiss:


WeBsPaCe - So 17.04.05 14:16

user profile iconHeiko hat folgendes geschrieben:
Dein moechtichhaben-Zeichen bekommst du mit chr(204) laut meiner DOS-ASCII-Tabelle :wink: .

Das ist ein anderes Zeichen. ;) Guck's dir nochmal genau an... ;)


Heiko - So 17.04.05 14:18

Das Zeichen gibt es bei mir in der Tabelle ansonsten nicht. Die am ähnlichsten dem sind, sind folgende:
chr(195): ├
chr(204): ╠


WeBsPaCe - So 17.04.05 14:21

Hast du Word? Dann geh mal auf Einfügen-Symbol und schreib unten bei Zeichencode "255F" bei "Unicode (hex)" rein. ;) Dann weißt du welches ich mein. ;) Und das war mal auf jeden Fall in der DOS-ASCII-Table drin! Glaub's mir. Ich bin nur zu faul zum scannen. ;)


delfiphan - So 17.04.05 14:26

Ah jetzt seh ich endlich das Problem. Falsche Codepage gewählt. Ihr habt ja alle eine Deutsche Windows-Installation. Ich eben nicht :) Das gesuchte Zeichen gibt es in der Deutschen Codepage nicht!
Gib mal den Befehl mode con codepage select=437 ein, bevor du dein Programm startest. (Ich hoffe dass die Codepage standardmässig installiert ist.)


WeBsPaCe - So 17.04.05 14:30

user profile icondelfiphan hat folgendes geschrieben:
Ah jetzt seh ich endlich das Problem. Falsche Codepage gewählt. Ihr habt ja alle eine Deutsche Windows-Installation. Ich eben nicht :) Das gesuchte Zeichen gibt es in der Deutschen Codepage nicht!
Gib mal den Befehl mode con codepage select=437 ein, bevor du dein Programm startest. (Ich hoffe dass die Codepage standardmässig installiert ist.)

Geht immer noch nicht... :gruebel:


Heiko - So 17.04.05 14:31

Tut mir leid, ich habe kein Word. Aber ich schick dir mal meine Tabelle, in der du das Zeichen suchen kannst :wink: , und du wirst sehen, dass dein Zeichen dort nicht gibt. Word nutzt dort vielleicht irgendwelche extra Sonderzeichen.

PS: Ich hoffe, dass es kein Problem gibt mit den Autoren und dem Verlag meines Tafelwerkes :wink: .


WeBsPaCe - So 17.04.05 14:37

user profile iconHeiko hat folgendes geschrieben:
Tut mir leid, ich habe kein Word. Aber ich schick dir mal meine Tabelle, in der du das Zeichen suchen kannst :wink: , und du wirst sehen, dass dein Zeichen dort nicht gibt.

Stimmt. Das ist halt eine Tabelle zum aktuellen Standart-ASCII-Zeichensatz.

user profile iconHeiko hat folgendes geschrieben:
Word nutzt dort vielleicht irgendwelche extra Sonderzeichen.

:gruebel: Wie? Das hab ich dir doch nur gesagt, damit du guckn kannst, wie das Ding genau aussieht. Ich hab doch da auch kein ASCII eingestellt. ;) War doch Unicode. ;)


delfiphan - So 17.04.05 15:06

user profile iconWeBsPaCe hat folgendes geschrieben:
Stimmt. Das ist halt eine Tabelle zum aktuellen Standart-ASCII-Zeichensatz.

"Aktueller" Zeichensatz? Hmm ;)

Man bemerke im Bild: "Code-Tabelle 850". Das ist der Deutsche Zeichensatz. Das gesuchte Zeichen ist aber in der Code-Tabelle 437. Mit mode con, siehe oben, kannst du die Code-Page ändern. Jedoch scheint das ganze dann nur im Vollbildmodus (Alt+Enter) zu klappen. Windows-Bug, oder so.

Sowas kommt der Sache vielleicht etwas näher (im Vollbildmodus sollte es klappen):

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

Var
 Dummy: DWord;
 S: String;
 Coord: _COORD;
begin
 SetConsoleOutputCP(437);
 S := Char(199);
 WriteConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE),Pointer(S),Length(S),Coord,Dummy);
 readln;
end.


Heiko - So 17.04.05 15:07

Ich meine damit, dass es ein Sonderzeichen von Word ist. So wie WordPerfect, das ist mein Schreibprogramm, auch ein paar hundert Sonderzeichen hat.

PS: Word ist von Microsoft und WordPerfect von Corel :wink: .


WeBsPaCe - So 17.04.05 15:10

:gruebel: Was soll denn das da unten alles??

So geht's auch:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils, Windows;

begin
readln;
SetConsoleOutputCP(437);
writeln(chr(199));
readln;
end.


Jedoch wiederum nur im Vollbildmodus... :eyes:


delfiphan - So 17.04.05 15:14

Ah gut, irgendwie hat's bei mir mit Writeln nicht geklappt, deswegen der direkte API Befehl. Hatte wohl irgend n Fehler drin.


WeBsPaCe - So 17.04.05 15:14

user profile iconHeiko hat folgendes geschrieben:
Ich meine damit, dass es ein Sonderzeichen von Word ist. So wie WordPerfect, das ist mein Schreibprogramm, auch ein paar hundert Sonderzeichen hat.

Nun ja. Ich bin eigentlich der Meinung, dass dieses Zeichen halt nicht in der ASCII-850-Codepage drin ist. Bei Unicode ist's jedoch noch da. <-- Bitte berichtigen, wenn falsch.
Mehr wollt ich da oben auch nicht sagen. :?

user profile iconHeiko hat folgendes geschrieben:
PS: Word ist von Microsoft und WordPerfect von Corel :wink: .

Meinst du das weiß ich nicht?!?!?!?! :motz: :mrgreen: ;)


WeBsPaCe - Di 19.04.05 19:48

Ja, kann man die Ausgabe der Konsolenanwendung jetzt irgendwie auf Unicode umstellen? Weil dass das nur im Fullscreen gut aussieht passt mir nicht so... ;)


Heiko - Di 19.04.05 19:57

Wenn dir das Design nicht gefällt schreib doch gleich eine Anwendung mit Canvas :wink: . Dann kannst du jedes beliebige Design machen.


WeBsPaCe - Di 19.04.05 20:29

Ich würde schon gerne bei Konsolenanwendungen bleiben. ;)