Problem mit ASCII Code

Gast #320050
Lesenswert?

Hi!

ASCII-Code nach ISO-Norm 8859-1 haben die "ÄÖÜäöü"
hexwert "C4h,D6h,DCh,E4h,F6h"

d.h. wenn man nun im Texteditor die Umlaute eingibt haben sie auch den
entsprechenden o.g.  Hexwert

Wenn ich die ASCII-Code Tabelle mit dieser Routine Ausgebe

#include <stdio.h>


void main(void)
{
  int i;

  for(i=0; i<256; i++)
  {
    printf("%d, %x,  %c\n",i,i,i);
  }



}

Haben die Umlaute ganz andere Hexwerte für Ü = 9Ah, Ö = 99h, Ä = 8Eh.


So jetzt die frage woher kommt der Unterschied?

Hab nämlich das Problem diese Abweichung in meiner ASCII-CODE Tabelle
zuberechnen.

Weiss da jemand einen Rat bzw. hat ne Lösung?
Persönliche Seite #320051
Lesenswert?

Du beschreibst nicht, wo Du das "Programm" laufen lässt. Angenommen,
es sei ein Konsolenfenster auf einem PC, dann gilt, daß dieses eine
andere Zeichencodierung verwendet, nämlich die sogenannte Codepage 850
oder 437. Diese stammen noch aus der Ursteinzeit des PC und geben die
von IBM eingeführte 8-Bit-Zeichencodierung wieder.

Mach mal folgendes:

Stelle im Konsolenfenster die Schriftart "Lucida Konsole" anstelle
der Rasterschriftart ein.

Gebe folgendes in der Eingabeaufforderung im selben Konsolenfenster
ein:

   mode con cp select=1252

und rufe dann im selben Konsolenfenster Dein Programm auf.

Na, was passiert?
Gast #320052
Lesenswert?

Du bist drauf reingefallen, dass unter Windows der _ANSI_-Zeichensatz
gilt.
Der ASCII- ist mit dem ANSI-Zeichensatz nur bis 0x7F bzw. 127 (= die
ersten 128 Zeichen) identisch.
Da in beiden die Umlaute einen größeren Wert als 127 haben, hast du
somit auch den Unterschied erklärt.

HTH

Ralf
Gast #320053
Lesenswert?

Aha!

Das würde bedeuten, dass ich im Editor oder wo auch immer den ANSI
Zeichensatz rausschmeissen muss sonnst compiliert der mir ja falsch.

Es geht darum auf einem Grafik Display Umlaute auszugeben und ich
dachte das man mit dem ASCII-Code.

Der µC den ich einsetzte ist ein Atmel AT89C51ED2


Trotzdem Danke!
Persönliche Seite #320054
Lesenswert?

Wenn Du ein LC-Display verwendest, dann musst Du schon ins Datenblatt
des LC-Displays sehen, was das für einen Zeichensatz verwendet. Die
beliebten HD44780-Controller haben oberhalb 0x7f eine völlig eigene
Sichtweise und halten sich an keinerlei Norm.

Der Anmerkung von Ralf sei noch hinzugefügt, daß ASCII nur einen
7-Bit-Zeichensatz beschreibt.
8-Bit-Zeichensätze vor ANSI (auch CP1252, Latin-1 oder ISO 8859-1)
waren teilweise sehr kreativ "anders", wie der berühmte
IBM-Zeichensatz, der des Atari ST oder die auf Macs verwendete
Variante.
#320056
Lesenswert?

Hallo Norad,

dann programmiere deinen Zeichensatz fürs Display so, dass er zu deinen
ASCII Zeichen passt. Ich habe das gleiche Display und stand ebenfalls
vor diesem Problem. Ich habe dann einfach den HC44780 Zeichensatz
kopiert. Anbei eine ZIPped BMP Datei mit meinem Zeichengenerator. Liest
sich von Links nach Rechts und alle Zeichen haben das Format 5x7 Pixel.
Die grauen Linien dienen nur als Orientierung.

MFG

Kai
Angehängte Dateien:
Gast #320059
Lesenswert?

>muss ich den Ansicode von den
>Adressen her gleich abbilden d.h. die 256 Zeichen.

Nach Deinem Beispiel: ja. Solltest Du Tastatureingaben auswerten, musst
Du in der Dokumentation Deines Compilers nachschlagen, ob und wann zwei
Bytes zurückgegeben werden (Unicode). Meist ist das aber nicht der
Fall.

Ich fasse mal kurz zusammen:

Ein Windows-Programm (GUI) arbeitet normalerweise mit dem, was
Microsoft ANSI-Format nennt. Das ist identisch mit der IANA-Bezeichnung
"Windows-1252". Eine Gegenüberstellung der Zeichensätze gibt es hier:

http://de.selfhtml.org/inter/sprache.htm

ISO-8859-1 und Windows-1252 sind nicht identisch, was Du immer wieder
erfährst, wenn Du mit Firefox auf Homepages gehst, die
fahrlässigerweise in Windows erstellt und lediglich mit dem Internet
Explorer getestet wurden oder umgekehrt mit dem Internet Explorer einen
Linuxianer besuchst.

HTH
viele grüße
ralph
Gast #320060
Lesenswert?

Noch was vergessen:

Ein Programm in der Windows-Konsole ("Eingabeaufforderung") arbeitet
normalerweise mit einem Zeichensatz, den Microsoft ASCII nennt:

http://msdn2.microsoft.com/de-de/library/9hxt0028(VS.80).aspx

Manchmal wird er auch Codepage 850 genannt und wenn ein uraltes
DOS-Programm keine richtigen Linien zeichnen kann, stellt man
zweckmäßigerweise die Codepage auf 437 um. Rufus T. Butterfly hat
gezeigt, wie man die Codepage in der Konsole auf Windows-1252 umstellen
kann.

viele grüße
ralph

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren