O identificador da página de códigos UTF-8 (65001) pode ser diferente em outros computadores?

2

Recentemente, tentei explicar a um amigo como criar um arquivo em lote simples de uma linha:

subst t: "X:\Example"

Na minha máquina que tem funcionado bem por anos, mas na deles eu me deparei com um problema: o nome deles continha caracteres não-ASCII (os caracteres turcos ı e ç para serem exatos) que não eram reconhecidos corretamente.

A solução simples para isso é que eu adicionaria

chcp 65001

na parte superior do arquivo para alterar a página de códigos ativa para a UTF-8.

Mas isso não funcionou. Em seu computador, isso causou uma falha no shell de comando que estava sendo executado. Eu os fiz experimentar alguns valores diferentes; 65000 caiu, mas 10000 não e todos os valores abaixo do que eu tentei funcionou também, mas não corresponde às mesmas páginas de código que os mesmos valores no meu computador. Sua página de código padrão também era diferente (857, em vez de 850, como no meu computador. Isso faz sentido, já que, de acordo com o MSDN, o 857 é uma página de código turca e 850 é um código da Europa Ocidental).

Eu sei que algumas páginas de código podem mudar de computador para computador, mas a página do MSDN afirma explicitamente que se deve usar UTF-8 porque as outras páginas podem mudar (embora haja uma falta de documentação sobre como e quando elas mudam ).

Isso é falso? O valor de 65001 também pode mudar? Se sim, por que isso causaria uma falha? Não deveria reclamar sobre "Página de códigos inválida" na pior das hipóteses? E se isso mudar, como alguém pode descobrir qual valor usar para obtê-lo ou o que mais eu poderia fazer para aceitar caracteres não-ASCII?

Estou usando o windows 10 com o idioma inglês (veio pré-instalado com o windows 8.1 em italiano) enquanto meu amigo usa o windows 7 em turco.

    
por Annonymus 26.08.2016 / 23:30

1 resposta

2

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 ACP 1252 (CP 437 ),
  • English (UK) : ANSI corresponde ao ACP 1252 (CP 850 ),
  • Turkish : ANSI corresponde ao ACP 1254 (CP 857 ),
  • Central Europe: ANSI corresponde ao ACP 1250 (CP 852 ), 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\                                    
por 05.09.2016 / 10:24