evinben
Goto Top

Batch-Skript in Unicode als robustere und universelle Lösung. Vorteile, Nachteile

Hallo,

ist es möglich Batch-Dateien anstatt in ANSI auch in Unicode irgendwie so zu schreiben, sodass sie dann ebenso reibungslos ausgeführt werden können und in der Eingabeaufforderung die Zeichen korrekt angezeigt werden?
Bzw. wo gäbe es eventuelle Probleme? Also was würde gegen Unicode speziell bei Batches sprechen?

Im Windows-Editor lassen sich z. B. beim "Speichern unter" neben ANSI auch folgende Unicode-Kodierungen auswählen:

- Unicode
  • (in Notepad ++ wird die Kodierung als UCS-2 Little Endian angezeigt, was ich aber mit diesem Suchbegriff in Wikipedia erstaunlicherweise nichts finden können, sondern eher, dass Windows-OS generell als Kompromiss zw. UTF-8 und UTF-32 intern auf UTF-16 setz. OK, über "UCS" (Unicode Transformation Format) gibt es dagegen genügend Stoff: https://de.wikipedia.org/wiki/Unicode_Transformation_Format)

- Unicode Big Endian (in Notepad ++ wird die Kodierung als UCS-2 Big Endian angezeigt)
und
- UTF-8

Mir geht es konkret darum das Problem mit den Batch-Dateien, geschrieben auch auf anderen Sprachen, auf PCs umzugehen, auf denen z. B. aktuell ein anderes Sprachschema in den Einstellungen gesetzt ist (die hier gemeinte Einstellung wäre unter Windows 7 z.B.:
Systemsteuerung\Zeit, Sprache und Region > Region und Sprache > Verwaltung > Sprache für Unicode-inkompatible Programme > Gebietsschema ändern
oder direkt als Pfad zu "Regions- und Sprachoptionen":
%systemroot%\system32\control.exe /name Microsoft.RegionalAndLanguageOptions).

In der Windows-Hilfe steht folgendes dazu, aber dies ist für mich nicht gerade hilfreich:
"Ändern des Systemgebietsschemas
Das Systemgebietsschema bestimmt den standardmäßigen Zeichensatz (Buchstaben, Symbole und Zahlen) und die Schriftart, die Sie zum Eingeben von Informationen verwenden und die zum Anzeigen von Informationen in Programmen verwendet werden, die nicht Unicode verwenden. Auf diese Weise können Nicht-Unicode-Programme mit der angegebenen Sprache auf dem Computer ausgeführt werden. Möglicherweise müssen Sie das standardmäßige Systemgebietsschema ändern, wenn Sie zusätzliche Anzeigesprachen auf Ihrem Computer installieren. Wenn Sie eine andere Sprache für das Systemgebietsschema auswählen, hat dies keine Auswirkung auf die Sprache in den Menüs und Dialogfeldern von Windows oder anderen Programmen, die Unicode verwenden.
"

Ich will ja letztendlich, dass wenn ich in einem Batch-Skript auf einem Rechner auf Deutsch in Unicode schreibe und dieses schließlich ausführe, dass mir dann in der Eingabeaufforderung auch die Umlauten korrekt angezeigt werden und dass die intern gesetzte Pfade mit Umlauten auch korrekt verarbeitet werden.
Bisher beim Abspeichern mit einer ANSI-Kodierung schreibe ich in jeder Batch-Datei in der Kopfzeile chcp 1252, um die Verwendung der "westeuropäischen" Codepage zu erzwingen. Aber wie gesagt dies ist alles echt eine Sackgasse auf Rechnern mit anderem Gebietsschema: All dies funktioniert reibungslos nur auf Rechnern, bei denen das Gebietschema in Windows auf "Deutsch" gesetzt ist. Ist dies nicht der Fall, verwandelt sich die Datei beim Bearbeiten einfach in Kriksel-Kraksel, mit undefinierten Buchstaben oder schlimmsten nur Fragezeichen, je nachdem und dann fang mal an…

Also wenn ich mich auf Betriebssysteme (ab zumindest Windows 7) begrenzen würde, gäbe es da bei der Auswahl einer vernünftigen Kodierung universelle/robuste Lösungen und welche soll diese dann lieber sein?
Und muss dann die Codepage im Batch-Skript explizit gesetzt sein und welche wäre sie z. B. für Deutsch (bzw. wie kann die nötige Codepage ermittelt werden)?

Mit mehreren Experimenten ist es mir nämlich nicht gelungen in den letzen paar Monaten eine brauchbare Unicode-Lösung zu finden, weil immer irgendwelche Probleme aufgetaucht waren (habe mir leider nicht alles systematisch notiert). Daher benutze ich nachwievor ANSI-Kodierung, in der Kombination mit chcp 1252 in der Kopfzeile. Aber wie gesagt, dies läuft dann auf anderen Sprachumgebungen eben nicht. Da muss genauso gebastelt werden und noch ein Problem dabei ist, dass die Scripts mehrfach angelegt werden müssen bzw. nur umständlich verwaltet werden können face-sad. Also um ein Batch-Skript, das auf einer anderen Sprache geschrieben ist, ändern zu können, muss ich erst das Gebietsschema ändern und sogar ein Neustart durchführen.

Daher versuche ich mal wieder hier im Forum wie immer eine hilfreiche Antwort zu finden.

Viele Grüße
evinben

Content-ID: 299288

Url: https://administrator.de/contentid/299288

Ausgedruckt am: 24.11.2024 um 12:11 Uhr

SamvanRatt
SamvanRatt 16.03.2016 um 22:09:28 Uhr
Goto Top
Hi evinben
ich kenne dein Problem; eine wirkliche Lösung kenne ich aber nicht.
chcp 65001 (=UTF-8 Seite) ist eine Möglichkeit, ABER die cmd.exe kennt nur sehr begrenzt unicode. TCC (=4nt Nachfolger) kennt unicode, ist aber wieder nicht Standard. Wenn du dich (sprachlich) fortbewegen kannst/willst wäre die powershell gut: voll Unicode fähig und einen gewaltigen Umfang an OS Manipulationen. Ich arbeite seit 1991 mit 4nt/tcc und schleppe es via UNC mit mir herum und muß daher nicht von meiner gewohnten Umgebung abweichen, ps ist aber in jedem Fall die modernere Wahl und ab W7 ja überall dabei (ich muß dagegen noch bis DOS5.0 und NT3.51 abdecken).
Sofern du in deinen Batches auch externe Programme aufrufst/abgreifst bist du da wieder beim kleinsten gemeinsamen Nenner....
Gruß
Sam
rubberman
rubberman 16.03.2016 aktualisiert um 22:17:46 Uhr
Goto Top
Hallo evinben,

willkommen in der wunderbaren Welt von Windows. Während die cmd.exe intern mit Unicode umgehen kann, darf ein Batchscript nur in einer Singlebyte Codierung vorliegen. Und selbst wenn du eine Codepage gefunden hast, die bestimmte von dir benötigte Zeichen enthält, heißt das noch längst nicht, dass du für das Windows Consolefenster eine Schriftart einstellen kannst, die diese Zeichen unterstützt. Dazu kommt noch, dass Texteditoren deinen Scriptcode in einer anderen Codierung ablegt, wie er in der CMD geparst wird. Aber das weißt du ja bereits.
Lange Rede kurzer Sinn, du wirst es nicht schaffen deine Batch Scripts unabhängig von Locale Einstellungen zu schreiben. Schade um die Zeit die du investierst, glaub mir.

Du kannst noch ein bisschen spielen, wenn du willst.
for /f "tokens=2*" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v "ACP"') do set /a acp=%%j  
for /f "tokens=2*" %%i in ('reg query "HKLM\SYSTEM\CurrentControlSet\Control\Nls\CodePage" /v "OEMCP"') do set /a oemcp=%%j  
Nun hast du 2 Variablen deren Inhalt dir bekannt vorkommen sollte und die du mit CHCP verwursten kannst. Hilft dir am Ende aber auch nicht wesentlich weiter ...

Grüße
rubberman