Basicamente, o Windows cmd
(e também o interpretador de script em lote) depende
Conformidade da página de códigos ativa (atual) e codificação de script em lote. Por exemplo, se você salvar um script de Notepad
na codificação ANSI (que depende strongmente de Windows system locale ), então você deve executá-lo na página de código correspondente, consulte Referência da API do NLS (National Language Support) :
-
English (US) :
ANSI corresponde ao ACP1252
(CP437
), -
English (UK) :
ANSI corresponde ao ACP1252
(CP850
), -
Turkish :
ANSI corresponde ao ACP1254
(CP857
), -
Central Europe:
ANSI corresponde ao ACP1250
(CP852
), etc.
Sua presunção está correta:
The simple solution to this that I would be to add
chcp 65001
at the top of the file to change the active codepage to the UTF-8 one. … But this didn't work.
Infelizmente, nem o Windows cmd
nem o intérprete em lote se preocupam com Marca de ordem de byte e a tratam como um caractere válido. desconsiderando a página de código ativa no momento.
Portanto, a primeira linha ( CHCP 65001
comando no seu caso) de um arquivo codificado UTF-8 é suja se a BOM estiver presente; uma tentativa de executar o comando dingy levaria à mensagem de erro ' CHCP' is not recognized as an internal or external command, operable program or batch file
(errorlevel 9009
).
Solução: salve seu script UTF-8 codificado sem BOM .
Solução alternativa se você não puder fazer isso (como Notepad
sempre grava a BOM): use um comando fictício como a primeira linha do seu script, por exemplo, da seguinte forma:
@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\