Forum: Compiler & IDEs Wie das Gradzeichen in einen String packen?


von Peter Z. (Gast)


Lesenswert?

Hallo allerseits,
1
char bla[9] = "T=   . °C";
funktioniert so nicht, anstelle des Gradzeichens ASCII 248 bekomme ich 
ASCII 176.
mit
1
bla[7] = 248;
kann ich das korrigieren, finde das aber nicht elegant...
1
char bla[9] = "T=   . \xF8C";
(wie bei printf) geht auch nicht.
Wie kann man das machen?

von Wolfgang H. (frickelkram)


Lesenswert?

Da musst Du Dich mal mit Zeichensätzen auseinander setzen, UTF8, iso, 
CP850 ...
Es hängt sehr von Deiner Umgebung ab was da angezeigt wird. Ist das 
Codebeispiel für die Ausgabe auf einem PC? Welches Betriebsystem? Oder 
für einen Mikrocontroller auf einem LCD-Display? Welches LCD-Display 
verwendest Du?

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Wenn dein Compiler darin F8C sieht: "...\xF8""C"
Wenn der Code beim LCD kein ISO ist: Datasheet vom LCD lesen.

: Bearbeitet durch User
von Peter Z. (Gast)


Lesenswert?

A. K. schrieb:
> "...\xF8""C"

Was bedeuten die beiden " Zeichen zwischen \xF8 und C?

von (prx) A. K. (prx)


Lesenswert?

Ende und Anfang vom String. ;-)

von Peter Z. (Gast)


Lesenswert?

Wolfgang Heinemann schrieb:
> Welches LCD-Display
> verwendest Du?

EADOGS mit eigenem Zeichensatz.

von (prx) A. K. (prx)


Lesenswert?

Die Strings werden lexikalisch verkettet, aus "a" "b" wird "ab".

von Karl H. (kbuchegg)


Lesenswert?

Peter Zz schrieb:
> A. K. schrieb:
>> "...\xF8""C"
>
> Was bedeuten die beiden " Zeichen zwischen \xF8 und C?

Das sind einfach nur doppelte Gänsefüsschen.

Im Grunde hat A.K. da nichts anderes gemacht als 2 Strings 
hinzuschreiben. Er hätte es auch so machen können
1
  "...\xF8" "C"

Alles waraus es ankommt ist, dem Compiler klar zu machen, dass die 
Hex-Zahl bei \x nach F8 zu Ende ist, und das C nicht mehr dazu gehört.
Man könnte es auch so schreiben
1
char bla[9] = "T=   . " "\xF8" "C";

denn der Compiler ist verpflichtet aufeinanderfolgende Strings ohne 
Operation dazwischen zu einem einzigen String zusammenzufassen. So weit 
so gut, mit dem klitzekleinen Unterschied, dass jetzt klar ist, dass mit 
"\xF8" das eine Zeichen durch Angabe der Hex-Zahl komplett ist und "C" 
schon wieder der nächste String ist, der aus einem 'C' besteht.

Aus demselben Grund geht auch das hier
1
#define GRAD "\xF8"
2
3
4
char bla[] = "T=   . " GRAD "C";

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Diese automatische Stringverkettung ist eine feine Sache. Denn sie 
erlaubt zb anstelle von
1
char helpText[] = "Help\n<file>   Dateiname\n</s>    rekursiv\n<outfile> Ergebnis\n";

das ganze so hinzuschreiben
1
char helpText[] = "Help\n"
2
                  "<file>    Dateiname\n"
3
                  "</s>      rekursiv\n"
4
                  "<outfile> Ergebnis\n";

beide Schreibweisen führen zum gleichen Ergebnis. Aber die 2-te Version 
ist wesentlich leichter zu lesen, zu formatieren, zu warten und zu 
erweitern.

Also merken: 2 unmittelbar aufeinanderfolgende String-Literale werden 
vom Compiler zu einem einzigen String-Literal zusammengefasst.

: Bearbeitet durch User
von Peter Z. (Gast)


Lesenswert?

Karl Heinz schrieb:
> #define GRAD "\xF8"
>
> char bla[] = "T=   . " GRAD "C";

Das finde ich mal wirklich elegant!

Vielen dank an alle!

von Luther B. (luther-blissett)


Lesenswert?

Peter Zz schrieb:
> anstelle des Gradzeichens ASCII 248 bekomme ich

Im ASCII Code gibt es keine Gradzeichen. Ich nehme mal an, du 
programmierst under Windows, wo standardmäßig die Windows-1252 Kodierung 
verwendet wird in der '°' den Code 176 hat. Dein Ausgabegerät verwendet 
wohl "Codepage  850" (da ist '°' auf 248).

Die einfachste Lösung dürfte wohl sein, den Texteditor auf die Codepage 
des Zielsystems einzustellen, Notepad++ kann das beispielsweise.

Falls das nicht geht, die escapes nehmen. \xF8C geht nicht. weil hex 
escapes erst bei der ersten nicht-hexidezimalen Ziffer terminieren. Man 
muss den String unterbrechen, was blöd aussieht. Du kannst aber 
octal-escapes nehmen F8_16==370_8 also: "T=\370C"

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

Wenn die Zeichencodierung tatsächlich Codepage 850 (oder sonst etwas
Gängiges) ist, kannst du die Umcodierung auch dem Compiler überlassen:
1
gcc -fexec-charset=cp850 ...

Damit werden auch andere Nicht-ASCII-Zeichen, wie bspw. Umlaute richtig
an die Zielplattform angepasst, ohne dass man dafür den Quellcode
verunstalten muss.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Hmm. Dazu muss aber noch irgendwie spezifiziert werden, was die 
Quell-Codepage ist.
Wenn ein Windows-Editor verwendet wird, kann das CP1252 sein, oder 
aber UTF-8. Laut http://gcc.gnu.org/onlinedocs/cpp/Invocation.html nimmt 
gcc utf-8 an, wenn nichts anderes spezifiziert ist und/oder die "locale" 
nicht bestimmt werden kann.

Also noch diese Option dranhängen:

-finput-charset=cp1252

von Peter Z. (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Also noch diese Option dranhängen:
>
> -finput-charset=cp1252

Ich benutze ATMELStudio6.
Wo würde ich diese Option dranhängen?

von Yalu X. (yalu) (Moderator)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Wenn ein Windows-Editor verwendet wird,
> […]
> Also noch diese Option dranhängen:
>
> -finput-charset=cp1252

Ja, das ist ratsam.

Solange in Windows weiterhin das bekannte Zeichenkodierungsbabel
vorherrscht und auch keine praktikable zentrale Einstellmöglichkeit der
Kodierungen eingeführt wird, sollte man die "input-charset"-Option
eigentlich immer angeben, wenn man Umlaute u.ä. in Strings verwendet,
und nicht nur dann, wenn die Zeichen – wie in diesem Fall – für eine
andere Zielplattform konvertiert werden müssen.

Peter Zz schrieb:
> Rufus Τ. Firefly schrieb:
>> Also noch diese Option dranhängen:
>>
>> -finput-charset=cp1252
>
> Ich benutze ATMELStudio6.
> Wo würde ich diese Option dranhängen?

Dort wo du auch das -fexec-charset hinschreibst ;-)

Nee, ich weiß es nicht. Gibt es im ATMELStudio6 nicht irgendwo ein Feld
für allgemeine Compiler-Optionen? Wenn du mit Makefiles arbeitest,
kannst du die Optionen auch direkt dort heineinschreiben. Meistens gibt
es dort eine Zeile mit
1
CFLAGS = ...

wo man eigene Optionen anhängen kann.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Yalu X. schrieb:
> Solange in Windows weiterhin das bekannte Zeichenkodierungsbabel
> vorherrscht

Welches genau magst Du meinen? Neuere Editoren (und das schließt 
notepad.exe von XP mit ein) können UTF-16, UTF-8 und CP1252 
auseinanderhalten, nur andere 8-Bit-Codepages sind ein Problem (das 
Fossil CP437/850 beispielsweise wird gerne in der "Eingabeaufforderung" 
verwendet, muss aber nicht, die kann auch mit CP1252 betrieben werden).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.