Grundsätzlich ist Windows cmd
(und sein Batch-Script-Interpreter) auf die Konformität (aktueller) aktiver Codepage und Batch-Script-Kodierung angewiesen. Zum Beispiel, wenn Sie einen Skript aus speichern Notepad
in sogenannter ANSI - Codierung (die auf stark abhängig Windows - Systemgebietsschema ), dann sollten Sie es unter entsprechender Codepage finden Sie unter National Language Support (NLS) API - Referenz :
English (US) :
ANSI entspricht ACP1252
(CP437
),English (UK) :
ANSI entspricht ACP1252
(CP850
),Turkish :
ANSI entspricht ACP1254
(CP857
),Central Europe:
ANSI entspricht ACP1250
(CP852
) usw.
Ihre Vermutung ist richtig:
Die einfache Lösung dazu wäre, ich würde
chcp 65001
am Anfang der Datei hinzufügen , um die aktive Codepage in eine UTF-8- Datei zu ändern. … Aber das hat nicht funktioniert.
Leider cmd
kümmert sich weder Windows noch Batch Interpreter um Byte Order Mark und behandeln sie als gültiges Zeichen, wobei die derzeit aktive Codepage nicht berücksichtigt wird.
Daher ist die erste Zeile ( CHCP 65001
in Ihrem Fall der Befehl) einer UTF-8- codierten Datei verschmutzt, wenn die Stückliste vorhanden ist. ein Versuch, so laufen schmuddeligen Befehl würde zu Fehlermeldung führt ' CHCP' is not recognized as an internal or external command, operable program or batch file
(Errorlevel 9009
).
Lösung: Speichern Sie Ihr Skript UTF-8- codiert ohne Stückliste .
Umgehung, wenn Sie dies nicht tun können (wie Notepad
immer schreibt BOM): Verwenden Sie als erste Zeile Ihres Skripts einen Dummy-Befehl, z. B. wie folgt:
@rem if this line is visibly executed then BOM is present >NUL 2>&1 @echo OFF rem save current code page to the `_chcp` variable for /F "tokens=2 delims=:" %%G in ('chcp') do set "_chcp=%%G" rem change active code page to UTF-8 (silently) CHCP 65001 >NUL rem echo this is UTF-8 encoded batch file %~nx0 echo( subst t: "D:\bat\Unusual Names\Türkçe (Türkiye)\çğüşöıĞÜİŞÇÖ" subst dir /B /S t:\*.txt subst t: /D echo( echo( works as well for characters from Unicode Basic Multilingual Plane subst t: "D:\bat\Unusual Names\CJK\中文(繁體)" subst dir /B /S t:\*.txt subst t: /D echo( echo( works even for characters from Unicode Supplementary Multilingual Plane subst t: "D:\bat\Unusual Names\" subst dir /B /S t:\*.txt subst t: /D rem set active code page back to previously saved value (verbose) echo( CHCP %_chcp%
Ausgabe :
==> utf8.bat ==> ´╗┐@rem if this line is visibly executed then BOM is present 1>NUL 2>&1 T:\: => D:\bat\Unusual Names\Türkçe (Türkiye)\çğüşöıĞÜİŞÇÖ t:\ĞÜİŞÇÖçğüşöı.txt works as well for characters from Unicode Basic Multilingual Plane T:\: => D:\bat\Unusual Names\CJK\中文(繁體) t:\chinese traditional.txt works even for characters from Unicode Supplementary Multilingual Plane T:\: => D:\bat\Unusual Names\ t:\Mathematical Bold Script.txt Active code page: 852
Schließlich können Sie die erste Zeile (mit der Stückliste) mit folgendem more
Befehl aus dem Skript entfernen (Hinweis chcp 65001
vor dem Ausführen more +1 …
):
==> chcp 65001 Active code page: 65001 ==> more +1 utf8.bat > utf8noBOM.bat ==> utf8noBOM.bat T:\: => D:\bat\Unusual Names\Türkçe (Türkiye)\çğüşöıĞÜİŞÇÖ t:\ĞÜİŞÇÖçğüşöı.txt works as well for characters from Unicode Basic Multilingual Plane T:\: => D:\bat\Unusual Names\CJK\中文(繁體) t:\chinese traditional.txt works even for characters from Unicode Supplementary Multilingual Plane T:\: => D:\bat\Unusual Names\ t:\Mathematical Bold Script.txt Active code page: 65001 ==>