www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SDCC und Strings mit Umlauten


Autor: StefanK. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forumsmitglieder,

ich bin gerade dabei ein umfangreiches Programm von Pascal nach C zu 
portieren. Im Programm werden viele Textstrings in verschiedenen 
Sprachen verwendet. Ich habe mir ein array of struct gebaut das im 
Codebereich abgelegt wird. Nun ist es aber so, dass die Strings auch 
Umlaute enthalten, mit denen kommt der SDCC aber anscheinend nicht 
zurecht. Hier ein Ausschnitt in C:
 
    {0x1A,"Halterung          ",0x06,0x09,0x00},
    {0x00,"fr Folien-        ",0x00,0x0A,0x00},
    {0x00,"aufnahme           ",0x00,0x08,0x00},
    {0x00,"nach oben          ",0x00,0x09,0x00},
    {0x00,"rechts             ",0x00,0x06,0x00},
    {0x00,"schwenken          ",0x00,0x09,0x00},

und das macht der Compiler daraus:
.db #0x1A  ; 26
  .ascii "Halterung          "
  .db 0x00
  .db #0x06  ; 6
  .db #0x09  ; 9
  .db #0x00  ; 0
  .db #0x00  ; 0
  .ascii "f"
  .db 0xFC
  .ascii "r Folien-        "
  .db 0x00
  .db #0x00  ; 0
  .db #0x0A  ; 10
  .db #0x00  ; 0
  .db #0x00  ; 0
  .ascii "aufnahme           "
  .db 0x00
  .db #0x00  ; 0
  .db #0x08  ; 8
  .db #0x00  ; 0
  .db #0x00  ; 0
  .ascii "nach oben          "
  .db 0x00
  .db #0x00  ; 0
  .db #0x09  ; 9
  .db #0x00  ; 0
  .db #0x00  ; 0
  .ascii "rechts             "
  .db 0x00
  .db #0x00  ; 0
  .db #0x06  ; 6
  .db #0x00  ; 0
  .db #0x00  ; 0
  .ascii "schwenken          "
  .db 0x00
  .db #0x00  ; 0
  .db #0x09  ; 9
  .db #0x00  ; 0

Das erste Byte im struct ist die Nummer des Textes, dann kommt der Text 
als
String, danach Anzahl der Zeilen, die eigentliche Länge des Strings und 
ein Teiler, der woanders im Programm Verwendung findet.

Weiß jemand, wie ich dem SDCC die ASCII-Zeichen für Umlaute beibringen 
kann?

Gruß Stefan

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
StefanK. schrieb:
>... ich dem SDCC die ASCII-Zeichen ...

Da ist das Problem. ASCII hat keine Umlaute.

der SDCC ignoriert das und hat exakt das "0xFC", dass in deinem 
Quelltext anstelle des 'ü' steht, in den ASM-Code übernomen.

Lösung => Speicher deinen Quelltext in dem Zeichensatz ab, den du 
nachher auch in deinen ASM-String-Konstanten haben willst.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0xFC ist der Zeichencode für das Zeichen "ü" in der Codepage 1252 
("Windows ANSI") bzw. in ISO8859-1.

Das ist also vom Compiler vollkommen korrekt umgesetzt worden.

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles so lassen und nur in der Ausgaberoutine der Texte eine Umkodierung 
vornehmen.

Autor: StefanK. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ANSI, ASCII, ISO ... alles zum Haareraufen. Ich habe jetzt folgendes 
gemacht:
{0x1A,"Halterung          ",0x06,0x09,0x00},
    {0x00,"fr Folien-        ",0x00,0x0A,0x00},
    {0x00,"aufnahme           ",0x00,0x08,0x00},

Das Zeichen, das hier an Stelle des "ü" erscheint, ist das Zeichen, das 
im Editor erscheint wenn man über die Zifferntasten mit gedrückter 
ALT-Taste die Zahl 0129 eingibt.

Der Compiler macht folgendes daraus:
.db #0x1A  ; 26
  .ascii "Halterung          "
  .db 0x00
  .db #0x06  ; 6
  .db #0x09  ; 9
  .db #0x00  ; 0
  .db #0x00  ; 0
  .ascii "f"
  .db 0xC2
  .db 0x81
  .ascii "r Folien-        "
  .db #0x00  ; 0
  .db #0x0A  ; 10
  .db #0x00  ; 0
  .db #0x00  ; 0
  .ascii "aufnahme           "

Er hat jetzt den richtigen Wert 0x81 eingefügt, aber wo kommt das 0xC2 
her?

Gruß Stefan

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ärgere dich nicht lange rum, sondern bau den Umlaut per Hex-Code ein. 
Sonst bist du immer deinem Editor und sonstigen UMgebungsbedingungen 
ausgeliefert
#define UMLAUT_U  "\x81"

...

   {0x00,"f" UMLAUT_U "r Folien-        ",0x00,0x0A,0x00},


Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
StefanK. schrieb:
> Er hat jetzt den richtigen Wert 0x81 eingefügt, aber wo kommt das 0xC2
> her?

Dein Quelltext ist jetzt UTF-8-codiert. Ich bezweifle, daß das sinnvoll 
ist.

Autor: StefanK. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rufus, Karlheinz und die Anderen,

danke für Eure Hilfe, es hat jetzt geklappt, der Editor war tatsächlich 
noch auf UTF-8, keine Ahnung warum, hatte das vorhin vermutlich mal 
umgestellt.

Es funktioniert jetzt wenn man mit ALT + Ziffernblock den ASCII-Code 
eingibt, dann hat man zwar im Editor komische Zeichen, aber im Code 
stimmt es dann.

Gruß Stefan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.