Copyright Symbol und Umlaute in Batch Konsolen-Ausgabe darstellen

Es gibt bestimmte Zeichen, die im Zeichensatz der Schriftart der Windows Konsole nicht vorhanden sind. Beispielsweise das Copyright Zeichen ©.
Auch Umlaute sind so eine Sache, das habe ich aber damals schon in einem Beitrag aufgeklärt.

Nach ersten Recherchen meinerseite kurz gefasst: nur mit Fummelei ist das Copyright Symbol in der deutschen Konsole möglich. Die Darstellung des Symbols inklusive Umlaute ist aber vom System, von der Konsole, der Schriftart der Konsole und anderen Faktoren abhängig. Eine 100% zuverlässige Lösung gibt es nicht. Für gewöhnlich arbeitet man, wenn nötig, mit (C)opyright oder (C)Copyright stattdessen.

Aber ich hätte keinen Blog, wenn ich nicht bis zum Erbrechen recherchieren und testen würde, bis mir eine Lösung gut genug gefällt.

Ich habe mir die Windows Standards angesehen und 1, 2 Stunden rumprobiert.
Das Copyright Zeichen und Umlaute gleichzeitig sind möglich, jedoch nur mit ein wenig Fummelei.

Wer einfach nur schnell wissen will wie es geht kann hier das Video dazu sehen, der letzte Code unten im Artikel ist die finale Version. Alle ITler sollten zum eigenen Verständnis weiterlesen.

Wie funktioniert das alles und warum?

Basteln wir uns eine neue Batch im Notepad++, echo rein, schauen was passiert:

echo ©
pause

Simpel, oder? Funktioniert nicht, was ein Wunder.
copyright-symbol-in-batch-simple-try-2

Codepages (mehr dazu) sagen der CMD, mit welchem Zeichensatz die Batch Ausgaben dargestellt werden sollen. Über einen Trick, in dem das ® Zeichen aus der Codepage 1252 abgespeichert wird, lässt sich das © Zeichen in der deutschen Konsole (850 ist die normale westeuropäische Codepage) darstellen:

chcp 1252
set c=©
chcp 850
echo %c%

copyright-symbol-in-batch-codepage-try-2
copyright-symbol-in-batch-codepage-try-1Erläuterung: Der selbe Hexadezimalcode, der in der Codepage 1252 also hinter ® steht, steht in der Codepage 850 hinter ©, was mit diesem Trick ausgenutzt wird.
Trick via

Das heißt, um jederzeit ein Copyright Symbol darstellen zu lassen genügt es die aktuelle Codepage zu wechseln, in der Codepage 1252 das Copyright Symbol in eine Variable zu speichern und wieder auf die deutsche Codepage zurückzuwechseln.
Dazu bietet sich folgender Code an:

for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 1252
set c=©
chcp %cp%
echo %c%

copyright-symbol-in-batch-codepage-try-3

Für die Umlaute müsst ihr nun meinen alten Trick anwenden und hinnehmen, dass im Code das Copyright Symbol durch ein anderes Symbol ersetzt wird. Aber mit

%c%

kann es weiterhin gesetzt werden.
copyright-symbol-in-batch-codepage-final-symbol-und-umlaute

10 Kommentare

  1. Hallo HannesSchurig!

    Vielen Dank für diesen brillianten Workaround! Es war zwar nicht wichtig im engeren Sinne, aber es macht wirklich wesentlich mehr Freude, wenn die kleine Synchronisations-Batch mit robocopy ein echtes Copyright-Zeichen im Titel trägt.

    Wenn Du mal wieder zwei Stunden über hast, hättest Du dann vielleicht mal Lust, Deinen Lesern die Batch-Funktion for zu erklären? Sie wird bei Administrator.de zwar ausführlich und fachkundig erklärt, aber für einen Normalsterblichen wie mich völlig unverständlich. (Achtung, könnte auch 8-16 Stunden Arbeit kosten …)

    Nebenbei: Du verwendest eine echt gute Blog-Software, oder hast sie besonders gut eingestellt, alles ist sehr übersichtlich zu lesen, und die Kommentarfunktion ist sehr komfortabel.

    Nochmals vielen herzlichen Dank!
    Gruß,
    cr

  2. Hallo cr,

    euer Dank ist mein bester Antrieb. Freut mich, dass ich helfen konnte.

    Das Batch for ist eine Welt für sich und jedes Mal etwas Arbeit. Es kommt ganz drauf an was man machen möchte, mit for kann man ja wirklich eine Menge machen.
    Ein ganz allgemeiner Artikel könnte beliebig lang und kompliziert werden, wenn ich jeden irgendwie denkbar möglichen Verwendungszweck aufzeigen würde.

    Aber vielleicht eine Sammlung der typischsten for Anwendungen (Datei auslesen, Registry auslesen, Ausgaben parsen…) könnte man überlegen. Aber aufgrund der Komplexität werde ich das wohl nicht direkt angehen können; ich behalte es aber im Hinterkopf!

    Mein Blog ist eigentlich ein „ganz normales“ WordPress, natürlich an vielen Stellen stark an meine Bedürfnisse angepasst:

    Die Darstellung meiner Bilder haben ich mit eigenem CSS Code Anpassung optimiert, zu große Bilder werden mit Fancybox leicht eingebunden und angezeigt, beim Bildupload sorgt das Plugin Image Size Optimizer von Susann Wasikowski (mal dort in der „WP-Plugins“ Sektion suchen) dafür, dass die Bilder auf bestimmte Größen gestutzt und komprimiert werden. Außerdem sorge ich mit All In One SEO Pack und SEO Friendly Images für SEO-brauchbaren HTML Code hinter den Bildern.

    Der Kommentarbereich ist ebenfalls per CSS für eine optimale Darstellung angepasst, Uhrzeit entfernt, mit Comment Form Quick Tags ermögliche ich die Verwendung der [b] [i] [link] usw Buttons und dank AJAX Edit Comments ist es möglich die Kommentare zu bearbeiten/löschen. Mit No Self Pings von Michael D. Adams (weiß nicht ob er das Plugin noch anbietet), Simple Trackback Validation und Anti-Spam Plugins halte ich die Kommentare frei von Müll.

    Code Formatting mache ich mit Syntax Highlighter Evolved.

    Joah, das entsteht eigentlich von ganz allein in einigen Jahren Bloggerei.
    Einige dieser Plugins sind schon alt und werden nicht mehr weiterentwickelt, aber aktuell funktioniert alles ganz gut.

  3. Hallo HannesSchurig,

    vielen Dank für Deine Antwort. Aus Deinen detaillierten Angaben kann man unschwer erkennen, wie liebevoll und mühevoll Du Deinen Blog ausgearbeitet hast. Vielen Dank für die Weitergabe Deines Wissens!

    Richtig, über das FOR zu schreiben, kann extrem ausufern. Du brauchst ja auch hier keine Auftragsarbeiten auszuführen, es ist ja Dein Blog! Nur falls Du mal Lust bekommst und Dich das Thema kitzelt – ich werde drauf warten.

    Nochmals herzlichen Dank für Deine Tipps und Deine Hilfe! 🙂
    Beste Grüße,
    Christian

  4. Hallo Christian,
    „Auftragsarbeit“ würde ich es nicht nennen. Aber ich reagiere natürlich immer gerne auf Leseranfragen. Und für dieses Thema habe ich auf jeden Fall genug Material; schließlich ist Batch hier fast das Hauptthema.

    Also, stay tuned 😉

  5. Kleine Tipp: es geht auch ohne Wechsel der Code-Page. Das (C)-Zeichen gibt es auch in der Code-Page 850. Ich meine es wäre Zeichen 184.
    Der Notepad++ hält diese Codepage auch aus, wenn man beim Editieren der Batch-Datei die Sprache auf MS-DOS Stil stellt, dann kommt er auch mit Umlauten zurrecht. Versuche es mal mit echo ALT+184 auf der Konsole, 184 auf dem Ziffernblock. Wenn du dir das in eine Datei pipest, dann hast du eine Kopiervorlage, die die Code-page 850 aushält.

  6. Hallo HannesSchurig,

    vielen Dank für deinen Beitrag, das Thema hat mich die letzte Stunde ebenfalls beschäftigt. Bei mir lese ich aus einer Textdatei den Namen einer zu kopierenden Datei aus. Dieser KANN Umlaute enthalten.

    Dein Tipp bezieht sich „nur“ auf die Belegung von Variablen, die man mittels SET direkt im Skript mit Umlauten eintragen kann. Bei mir liegt der Umlaut aber ja nicht direkt im Batch-Skript drin.

    Ich habe es aber auch für meinen „generischen“ Fall zum Laufen gebracht. Dazu reicht aber die Codepage 1252 nicht aus. Ich wechsele nun in die Unicode Codepage (65001), dann belege ich die Variable mit dem Dateiinhalt, danach wieder auf Codepage 850, danach xcopy.

    Klappt, nur muss man aufpassen: bei mir (Win7 64bit) schmiert die Konsole ab, wenn man sich den Variableninhalt mittels echo ausgeben lassen will (das war bei der Fehlersuche nicht unbedingt sehr hilfreich…).

    Klappt also nicht alles super, aber zum Kopieren mit xcopy für Dateien mit Umlauten reicht es!

    VG ThomasT

  7. Noch eine kleine Konkretisierung: bei meinen zahlreichen Versuchen habe ich übersehen, dass ein Wechsel zurück in die ursprüngliche Codepage in meinem Fall nicht nötig ist.

    Ich wechsele jetzt zu Beginn des Skripts mit chcp 65001 die Codepage hin zu Unicode, dann funktioniert das Auslesen des Dateinamens (mit Umlauten) in eine Variable und anschließendes Nutzen dieser Variablen mittels xcopy ohne Probleme, was mit Codepage 1252 oder gar 850 nicht klappt!

    Laut Notepad++ ist übrigens die Datei, aus der ich den Dateinamen herauslese mit „UTF-8 ohne BOM“ kodiert.

  8. Hallo Thomas,

    danke für die ausführliche Hilfe zu dem Thema. Stimmt, mein Artikel bezieht sich rein auf die Nutzung von Umlauten im Skript selbst.
    Würde es dir was ausmachen mir dein Batch Skript, oder den entsprechenden Teil davon, per Mail zu schicken? Ich würde das dann nochmal in einem ergänzenden Blogpost festhalten.

    LG

Schreibe einen Kommentar