Como usar caracteres unicode na linha de comando do Windows?

Temos um projeto no Team Foundation Server (TFS) que tem um caractere não inglês (š) nele. Ao tentar criar scripts para algumas coisas relacionadas à construção, nos deparamos com um problema – não podemos passar a letra š para as ferramentas de linha de comando. O prompt de comando ou o que não está mais bagunça, e o utilitário tf.exe não consegue encontrar o projeto especificado.

Eu tentei diferentes formatos para o arquivo .bat (ANSI, UTF-8 com e sem BOM ), bem como scripts em JavaScript (que é inerentemente Unicode) – mas sem sorte. Como faço para executar um programa e passar uma linha de comando Unicode ?

Minha experiência: eu uso input / saída Unicode em um console por anos (e faço isso diariamente. Além disso, eu desenvolvo ferramentas de suporte exatamente para essa tarefa). Existem pouquíssimos problemas, até onde você entende os seguintes fatos / limitações:

  • CMD e “console” são fatores não relacionados. CMD.exe é apenas um dos programas que estão prontos para “trabalhar dentro” de um console (“aplicativos de console”).
  • AFAIK, CMD tem suporte perfeito para Unicode; você pode inserir / exportar todos os caracteres Unicode quando qualquer página de código estiver ativa.
  • O console do Windows tem muito suporte para Unicode – mas não é perfeito (apenas “bom o suficiente”; veja abaixo).
  • chcp 65001 é muito perigoso. A menos que um programa foi especialmente projetado para contornar defeitos na biblioteca de tempo de execução C da Microsoft (ou usa um CRTL diferente), ele não funcionaria de forma confiável.
  • Eu trabalho no cp1252 . Como eu já disse: Para input / saída de Unicode em um console, não é necessário definir a página de códigos .

Os detalhes

  • Para ler / gravar Unicode em um console, um aplicativo (ou sua biblioteca de tempo de execução C) deve ser inteligente o suficiente para usar não a API File-I / O, mas a API Console-I / O.
  • Da mesma forma, para ler argumentos de linha de comando Unicode, um aplicativo (ou sua biblioteca de tempo de execução C) deve ser inteligente o suficiente para usar a API correspondente.
  • A renderização da fonte do console suporta apenas caracteres Unicode no BMP (em outras palavras: abaixo de U+10000 ). Apenas a renderização simples de texto é suportada (de modo que os idiomas europeus – e alguns idiomas do leste asiático – devem funcionar bem – na medida em que se use formulários pré-compostos). [Há uma pequena impressão fina aqui para o Leste Asiático e para os caracteres U + 0000, U + 0001, U + 30FB.]

Considerações práticas

  • Os padrões na janela não são muito úteis. Para melhor experiência, deve-se sintonizar 3 partes de configuração:

    • Para saída: fonte do console. Para melhores resultados, recomendo minhas compilações . (As instruções de instalação estão presentes lá – e também listadas em outras respostas nesta página.)
    • Para input: layout de teclado capaz. Para melhores resultados, recomendo meus layouts .
    • Para input: permite input HEX de Unicode .
  • Mais uma pegadinha com “Colando” em um aplicativo de console (muito técnico):

    • Entrada HEX fornece um caractere no KeyUp de Alt ; todas as outras formas de entregar um personagem acontecem no KeyDown ; muitos aplicativos não estão prontos para ver um caractere no KeyUp . (Aplicável apenas a aplicativos que usam a API Console-I / O.)
    • Conclusão: muitos aplicativos não reagiriam em events de input HEX.
    • Além disso, o que acontece com um caractere “Colado” depende do layout atual do teclado: se o caractere pode ser typescript sem usar chaves de prefixo (mas com combinação complicada arbitrária de modificadores, como em Ctrl-Alt-AltGr-Kana-Shift-Gray* ) então é entregue em um pressionamento de tecla emulado. Isso é o que qualquer aplicativo espera – então, colar qualquer coisa que contenha apenas esses caracteres é bom.
    • No entanto, os “outros” caracteres são entregues através da emulação da input HEX .

    Conclusão : a menos que o layout do teclado suporte input de MUITOS caracteres sem chaves de prefixo, alguns aplicativos com bugs podem ignorar caracteres quando você Paste através da interface do usuário do console: Alt-Space EP . (É por isso que recomendo usar meus layouts de teclado!)

Deve-se também ter em mente que os consoles “alternativos, mais capazes” para o Windows não são consoles . Eles não suportam APIs de E / S de console, portanto, os programas que dependem dessas APIs para funcionar não funcionariam. (Os programas que usam apenas “APIs File-I / O para os filehandles do console” funcionariam bem, no entanto.)

Um exemplo de tal não-console é uma parte do Powershell da MicroSoft. Eu não uso isso; para experimentar, pressione e libere o WinKey e digite powershell .

Resumo

  • definir fonte, layout de teclado (e, opcionalmente, permitir input HEX).

  • use somente programas que passem por APIs de E / S de console e aceitem argumentos de linha de comando Unicode. Por exemplo, qualquer programa compilado por cygwin deve estar bem. Como já disse, o CMD está bem.

Experimentar:

 chcp 65001 

que irá mudar a página de código para UTF-8. Além disso, você precisa usar as fonts do console Lucida.

Eu tive o mesmo problema (sou da República Tcheca). Eu tenho uma instalação em inglês do Windows e tenho que trabalhar com arquivos em uma unidade compartilhada. Os caminhos para os arquivos incluem caracteres específicos para tchecos.

A solução que funciona para mim é:

No arquivo em lote, altere a página do conjunto de caracteres

Meu arquivo de lote:

 chcp 1250 copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp 

O arquivo de lote deve ser salvo no CP 1250.

Note que o console não mostrará os caracteres corretamente, mas os entenderá …

Verifique o idioma para programas não-Unicode. Se você tiver problemas com russo no console do Windows, então você deve definir russo aqui:

Alterando o Idioma para Programas Não-Unicode

Na verdade, o truque é que o prompt de comando realmente entende esses caracteres não ingleses, mas não consegue exibi-los corretamente.

Quando eu insiro um caminho no prompt de comando que contém alguns caracteres não ingleses, ele é exibido como “??? ?????? ?????”. Quando você envia seu comando (cd “??? ?????? ?????” no meu caso), tudo está funcionando como esperado.

É muito difícil alterar a página de código padrão do console do Windows. Quando você pesquisa na web, encontra propostas diferentes, no entanto, algumas delas podem quebrar completamente o seu Windows, ou seja, o seu PC não inicializa mais.

A solução mais segura é esta: Vá para a sua chave de Registro HKEY_CURRENT_USER\Software\Microsoft\Command Processor e adicione o valor String Autorun = chcp 65001 .

Ou você pode usar este pequeno Batch-Script para as páginas de códigos mais comuns.

 @ECHO off SET ROOT_KEY="HKEY_CURRENT_USER" FOR /f "skip=2 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i ECHO System default values: ECHO. ECHO ............................................... ECHO Select Codepage ECHO ............................................... ECHO. ECHO 1 - CP1252 ECHO 2 - UTF-8 ECHO 3 - CP850 ECHO 4 - ISO-8859-1 ECHO 5 - ISO-8859-15 ECHO 6 - US-ASCII ECHO. ECHO 9 - Reset to System Default (CP%OEMCP%) ECHO 0 - EXIT ECHO. SET /P CP="Select a Codepage: " if %CP%==1 ( echo Set default Codepage to CP1252 reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 1252>nul" /f ) else if %CP%==2 ( echo Set default Codepage to UTF-8 reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 65001>nul" /f ) else if %CP%==3 ( echo Set default Codepage to CP850 reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 850>nul" /f ) else if %CP%==4 ( echo Set default Codepage to ISO-8859-1 add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28591>nul" /f ) else if %CP%==5 ( echo Set default Codepage to ISO-8859-15 add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28605>nul" /f ) else if %CP%==6 ( echo Set default Codepage to ASCII add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 20127>nul" /f ) else if %CP%==9 ( echo Reset Codepage to System Default reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f ) else if %CP%==0 ( echo Bye ) else ( echo Invalid choice pause ) 

Usar @chcp 65001>nul vez de chcp 65001 suprime a saída “Página de códigos ativa: 65001” que você obteria toda vez que iniciar uma nova janela de linha de comando.

Uma lista completa de todos os números disponíveis que você pode obter de identificadores de página de código

Observe que as configurações serão aplicadas apenas para o usuário atual. Se você quiser configurá-lo para todos os usuários, substitua a linha SET ROOT_KEY="HKEY_CURRENT_USER" por SET ROOT_KEY="HKEY_LOCAL_MACHINE"

Em uma máquina Windows 10 x64, fiz o prompt de comando exibir caracteres não ingleses por:

Abra um prompt de comando elevado (execute o CMD.EXE como administrador). Consulte seu registro para fonts TrueType disponíveis para o console por:

  REG query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" 

Você verá uma saída como:

  0 REG_SZ Lucida Console 00 REG_SZ Consolas 936 REG_SZ *新宋体932 REG_SZ *MS ゴシック 

Agora precisamos adicionar uma fonte TrueType que suporte os caracteres que você precisa, como Courier New. Fazemos isso adicionando zeros ao nome da string, então, neste caso, o próximo seria “000”:

  REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" /v 000 /t REG_SZ /d "Courier New" 

Agora implementamos o suporte a UTF-8:

  REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 65001 /f 

Definir fonte padrão para “Courier New”:

  REG ADD HKCU\Console /v FaceName /t REG_SZ /d "Courier New" /f 

Definir tamanho da fonte para 20:

  REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f 

Ative a edição rápida se você quiser:

  REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f 

Como eu não vi nenhuma resposta completa para o Python 2.7, vou descrever os dois passos importantes e um passo opcional que é bastante útil.

  1. Você precisa de uma fonte com suporte a Unicode. O Windows é fornecido com o Lucida Console, que pode ser selecionado clicando com o botão direito do mouse na barra de título do prompt de comando e clicando na opção Defaults . Isso também dá access a colors. Observe que você também pode alterar as configurações das janelas de comando chamadas de determinadas maneiras (por exemplo, abrir aqui, Visual Studio) escolhendo Properties .
  2. Você precisa definir a página de códigos para cp65001 , que parece ser a tentativa da Microsoft de oferecer suporte UTF-7 e UTF-8 ao prompt de comando. Faça isso executando o chcp 65001 no prompt de comando . Uma vez definido, permanece assim até a janela ser fechada. Você precisará refazer isso toda vez que iniciar o cmd.exe.

Para uma solução mais permanente, consulte esta resposta no Superusuário. Em resumo, crie uma input REG_SZ (String) usando o regedit no HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor e AutoRun . Altere o valor para chcp 65001 . Se você não quiser ver a mensagem de saída do comando, use @chcp 65001>nul .

Alguns programas têm problemas para interagir com essa codificação, sendo que o MinGW é notável e falha ao compilar com uma mensagem de erro sem sentido. No entanto, isso funciona muito bem e não causa bugs na maioria dos programas.

Para um problema similar, (meu problema era mostrar caracteres UTF-8 do MySQL em um prompt de comando),

Eu resolvi assim:

  1. Alterei a fonte do prompt de comando para o Lucida Console. (Este passo deve ser irrelevante para a sua situação. Tem a ver apenas com o que você vê na canvas e não com o que é realmente o personagem).

  2. Eu mudei a página de códigos para o Windows-1253. Você faz isso no prompt de comando por “chcp 1253”. Funcionou para o meu caso em que eu queria ver o UTF-8.

Uma opção muito simples é instalar um shell bash do Windows como o MinGW e usar isso:

Digite a descrição da imagem aqui

Há um pouco de curva de aprendizado, pois você precisará usar a funcionalidade de linha de comando do Unix, mas você vai adorar o poder dele e pode definir o conjunto de caracteres do console como UTF-8.

Digite a descrição da imagem aqui

É claro que você também recebe todos os presentes * nix habituais como grep, find, less, etc.

Esse problema é muito chato. Eu geralmente tenho um caractere chinês no meu nome de arquivo e conteúdo de arquivo. Por favor, note que estou usando o Windows 10, aqui está a minha solução:

Para exibir o nome do arquivo , como dir ou ls se você instalou o Ubuntu bash no Windows 10

  1. Defina a região para suportar o caractere não utf 8.

  2. Depois disso, a fonte do console será alterada para a fonte dessa localidade e também mudará a codificação do console.

Depois de ter feito as etapas anteriores, para exibir o conteúdo do arquivo de um arquivo UTF-8 usando a ferramenta de linha de comando

  1. Mude a página para utf-8 por chcp 65001
  2. Mude para a fonte que suporta utf-8, como o Lucida Console
  3. Use o comando type para espiar o conteúdo do arquivo, ou cat se você instalou o Ubuntu bash no Windows 10
  4. Observe que, depois de definir a codificação do console para utf-8, não consigo digitar o caractere chinês no cmd usando o método de input chinês.

A solução mais preguiçosa: basta usar um emulador de console como http://cmder.net/

Uma decisão rápida para arquivos .bat se o computador exibir seu nome de caminho / arquivo correto ao digitá-lo na janela do DOS:

  1. copy con temp.txt [pressione Enter]
  2. Digite o caminho / nome do arquivo [pressione Enter]
  3. Pressione Ctrl-Z [pressione Enter]

Dessa forma, você cria um arquivo .txt – temp.txt. Abra-o no Bloco de Notas, copie o texto (não se preocupe, ele ficará ilegível) e cole-o no seu arquivo .bat. Executar o .bat criado dessa maneira na janela do DOS funcionou para mim (cirílico, búlgaro).

Uma coisa melhor e mais limpa a se fazer: Basta instalar o pacote de idioma japonês disponível da Microsoft. (Outros pacotes de idiomas orientais também funcionarão, mas eu testei o japonês).

Isto dá-lhe as fonts com os conjuntos maiores de glifos, torna-os o comportamento padrão, altera as várias ferramentas do Windows como cmd, WordPad, etc.

Alterar a página de código para 1252 está funcionando para mim. O problema para mim é que o símbolo double doller § está convertendo para outro símbolo pelo DOS no Windows Server 2008.

Eu usei o CHCP 1252 e um limite antes dele na minha declaração BCP.

Ocorreu um problema similar ao excluir arquivos com nome Unicode, referindo-se a eles no arquivo em lote por seus nomes curtos (8 pontos 3).

Os nomes abreviados podem ser visualizados fazendo dir /x . Obviamente, isso só funciona com nomes de arquivos Unicode que já são conhecidos.

Para utf-8: chcp 65001

Voltar ao padrão: chcp 437