Wie das Gradzeichen in einen String packen?

Gast #3423006
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?
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?
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";
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.
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"
Moderator
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.
Persönliche Seite
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
Moderator
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.
Persönliche Seite
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).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.