Pergunta

Temos um projeto no TFS (Team Foundation Server) que tem um carácter que não o inglês (š) nele.Ao tentar criar um script com algumas construir coisas relacionadas a nós deparei com um problema - não podemos passar a š carta para as ferramentas de linha de comando.O prompt de comando ou o que não mais mexe, e o tf.exe utilitário não pode localizar o projeto especificado.

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

Foi útil?

Solução

Meu plano de fundo: eu uso a entrada/saída do Unicode em um console por anos (e o faço muito diariamente. Além disso, desenvolvo ferramentas de suporte exatamente para esta tarefa). Existem muito poucos 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").
  • ATÉ ONDE SEI, CMD tem suporte perfeito para unicode; você pode inserir/produzir todos os chars unicode quando algum O codepage está ativo.
  • O console do Windows tem muito suporte para o Unicode - mas não é perfeito (apenas "bom o suficiente"; veja abaixo).
  • chcp 65001 é muito perigoso. A menos que um programa tenha sido especialmente projetado para contornar os defeitos na API do Windows (ou usa uma biblioteca de tempo de execução C que possui essas soluções alternativas), ela não funcionaria de maneira confiável. Win8 corrige ½ desses problemas com cp65001, mas o resto ainda é aplicável ao Win10.
  • eu trabalho em cp1252. Como eu já disse: Para inserir/sair unicode em um console, não é necessário definir a página de código.

Os detalhes

  • Para ler/escrever Unicode para um console, um aplicativo (ou sua biblioteca de tempo de execução C deve ser inteligente o suficiente para usar não File-I/O API, mas Console-I/O API. (Por exemplo, veja Como Python faz isso.)
  • Da mesma forma, para ler os argumentos da 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 de fontes do console suporta apenas caracteres unicode no BMP (em outras palavras: abaixo U+10000). Somente a renderização simples de texto é suportada (então europeias - e alguns idiomas do leste asiático - devem funcionar bem - até onde se usa formulários pré -compostos). [Existe um Pequenas letras pequenas Aqui para o leste asiático e para os personagens u+0000, u+0001, u+30fb.

Considerações práticas

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

    • Para saída: uma fonte abrangente do console. Para obter melhores resultados, eu recomendo minhas construções. (As instruções de instalação estão presentes lá - e também listadas em outras respostas nesta página.)
    • Para entrada: um layout de teclado capaz. Para obter melhores resultados, eu recomendo meus layouts.
    • Para entrada: Permitir a entrada hexadecimal do unicode.
  • Mais um petcha com "colando" em um aplicativo de console (muito técnico):

    • A entrada hexadecimal entrega um personagem KeyUp do Alt; tudo as outras maneiras de entregar um personagem acontecem KeyDown; Tantas aplicações não estão prontas para ver um personagem em KeyUp. (Apenas aplicável a aplicativos usando Console-I/O API.)
    • Conclusão: Muitos aplicações não reagiriam nos eventos de entrada hexadecimal.
    • Além disso, o que acontece com um caractere "colado" depende do layout atual do teclado: se o personagem pode ser digitado sem usar teclas de prefixo (mas com combinação arbitrária complicada de modificadores, como em Ctrl-Alt-AltGr-Kana-Shift-Gray*) então ele é entregue em uma teia emulada. É isso que qualquer aplicativo espera - portanto, colar qualquer coisa que contém apenas esses personagens está bem.
    • No entanto, os "outros" personagens são entregues por Emulando a entrada hexadecimal.

    Conclusão: A menos que o layout do teclado suporta a entrada de muitos caracteres sem teclas de prefixo, Alguns aplicativos de buggy Pode pular personagens quando você Paste via interface do console: Alt-Space E P. (este É por isso que eu 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 apoiam Console-I/O APIs, portanto, os programas que dependem dessas APIs para o trabalho não funcionariam. (Os programas que usam apenas “APIs de arquivo-i/o para o Console FileHandles” funcionariam bem.

Um exemplo de esse não console faz parte da Microsoft's Powershell. Eu não uso isso; Para experimentar, pressione e libere WinKey, então digite powershell.


(Por outro lado, existem programas como ConEmu ou ANSICON que tentam fazer mais: eles "tentam" interceptar Console-I/O As APIs para fazer com que "aplicativos verdadeiros de console" também funcionem. Isso definitivamente funciona para programas de exemplo de brinquedo; Na vida real, isso pode ou não resolver seus problemas específicos. Experimentar.)

Resumo

  • Defina a fonte, o layout do teclado (e opcionalmente, permita a entrada hexadecimal).

  • Use apenas programas que passam Console-I/O APIs e aceite argumentos da linha de comando Unicode. Por exemplo, qualquer cygwin-o programa compilado deve estar bem. Como eu já disse, CMD está bem também.

Up: Inicialmente, para um bug em cp65001, Eu estava misturando camadas de kernel e CRTL (UPD²: e API do modo de usuário do Windows!). Também: Win8 corrige metade desse bug; Esclareci a seção sobre o aplicativo "melhor console" e adicionei uma referência à forma como o Python o faz.

Outras dicas

Tentar:

chcp 65001

que alterará a página de código para UTF-8. Além disso, você precisa usar fontes de 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 tcheco.

A solução que funciona para mim é:

No arquivo em lote, altere a página do charset

Meu arquivo em lote:

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

O arquivo em lote deve ser salvo no CP 1250.

Observe que o console não mostrará os personagens corretamente, mas os entenderá ...

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

Changing language for non-Unicode programs

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

A solução mais segura é esta: vá para sua chave de registro HKEY_CURRENT_USER\Software\Microsoft\Command Processor e adicione o valor da string Autorun = chcp 65001.

Ou você pode usar este pequeno script em lote para as páginas de código 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
)

Usando @chcp 65001>nul ao invés de chcp 65001 Suprime a saída "Código ativo Página: 65001" Você obterá sempre que iniciar um novo Windows da linha de comando.

Uma lista completa de todo o número disponível de que você pode obter Identificadores de página de código

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

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

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

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 cmd.exe como administrador). Consulte seu registro para fontes de TrueType disponíveis no 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 suporta os personagens que você precisa como Courier New. Fazemos isso adicionando zeros ao nome da string; portanto, 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 UTF-8:

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

Defina a fonte padrão como "Courier New":

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

Defina o tamanho da fonte como 20:

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

Habilite o rápido editar se quiser:

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

Como não vi nenhuma resposta completa para o Python 2.7, descreverei as duas etapas importantes e uma etapa opcional que é bastante útil.

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

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

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

Uma opção realmente simples é instalar um shell do Windows Bash, como Mingw e use isso:

Enter image description here

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

Enter image description here

Claro que você também recebe todos os itens habituais *Nix como Grep, Localize, Leme, etc.

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

Eu resolvi assim:

  1. Mudei a fonte do prompt de comando para o Lucida Console. (Esta etapa deve ser irrelevante para a sua situação. Ela tem a ver apenas com o que você vê na tela e não com o que é realmente o personagem).

  2. Alterei a página de código para 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.

Achei esse método útil em novas versões do Windows 10:

Ligue esse recurso: "Beta: use Unicode UTF-8 para suporte ao idioma em todo o mundo"

Painel de controle -> Configurações regionais -> Guia Administrativa-> Alterar localidade do sistema ...

Region Settings

Esse problema é bastante irritante. Normalmente tenho caractere chinês no meu nome de arquivo e conteúdo de arquivo. Observe que estou usando o Windows 10, aqui está 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 caracteres não UTF 8.

  2. Depois disso, a fonte do console será alterada para a fonte desse local e também altera a codificação do console.

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

  1. Altere a página para UTF-8 por chcp 65001
  2. Mudança para a fonte que suporta UTF-8, como o Lucida Console
  3. Usar type comando 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 o UTF-8, não posso digitar o caractere chinês no CMD usando o método de entrada 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 você exibir o seu caminho/nome de caminho correto ao digitar no DOS-Window:

  1. Copie Con temp.txt pressione Enter
  2. Digite o nome do caminho/arquivo [Pressione Enter
  3. Imprensa 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 parecerá ilegível) e cole -o no seu arquivo .bat. A execução do .Bat criou dessa maneira em Dos-Window trabalhou para mim (Cirílico, Búlgaro).

Uma coisa mais limpa a se fazer: basta instalar o pacote de idiomas japonês gratuito e gratuito. (Outros pacotes de idiomas orientais também funcionarão, mas eu testei o japonês.)

Isso fornece as fontes 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 é o símbolo Double Doller § está convertendo para outro símbolo do DOS no Windows Server 2008.

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

Eu vejo várias respostas aqui, mas elas não parecem abordar a pergunta - o usuário deseja obter a entrada Unicode da linha de comando.

O Windows usa o UTF-16 para codificar em duas cordas de bytes, então você precisa obtê-las do sistema operacional no seu programa. Existem duas maneiras de fazer isso -

1) A Microsoft possui uma extensão que permite que o principal faça uma ampla matriz de caracteres: int wmain (int argc, wchar_t *argv []); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) Ligue para a API do Windows para obter a versão Unicode da linha de comando wchar_t win_argv = (wchar_t) CommandLineToargvw (getCommandlinew (), & nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

Leia isso: http://utf8everywhere.orgPara informações detalhadas, principalmente se você estiver apoiando outros sistemas operacionais.

A partir de junho de 2019, com o Windows 10, você não terá que alterar a página de códigos.

Ver "A Introdução De Terminal Do Windows"(a partir de Kayla Canela) e o Microsoft/Terminal.
Através da utilização de Consolas do tipo de letra, parcial Suporte a Unicode será fornecido.

Como documentado em Microsoft/Terminal problema 387:

Há 87,887 ideogramas atualmente em Unicode.Você precisa de todos eles também?
Precisamos de um limite, e caracteres além do que o limite deve ser tratada por fonte de fallback / vinculação de fontes / whatever.

O que Consolas deve abranger:

  • Caracteres usados como símbolos utilizados pela SOS modernos programas na CLI.
  • Esses caracteres devem seguir Consolas de design e métricas, e devidamente alinhado com as actuais Consolas de caracteres.

O que Consolas NÃO deve cobrir:

  • Caracteres de pontuação e de scripts que além de latim, grego e Cirílico, especialmente precisar de caracteres complexo de formação (como o árabe).
  • Estes caracteres devem ser tratados com o fallback.

Recebi um problema semelhante excluindo arquivos com nome Unicode, referindo-se a eles no arquivo em lote pelos nomes curtos (8 pontos 3).

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

Para UTF-8: chcp 65001

Voltar para o padrão: chcp 437

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top