Domanda

Abbiamo un progetto in Team Foundation Server (TFS), che ha un carattere non inglese (i) in esso. Quando si cerca di script di un paio di cose di build relative abbiamo incappato in un problema - non possiamo passare il S lettera agli strumenti della riga di comando. Il prompt dei comandi o che cosa non altro scombina in su, e la tf.exe utilità non riesce a trovare il progetto specificato.

Ho provato diversi formati per il file .bat (ANSI, UTF-8 con e senza BOM ), così come script in JavaScript (che è intrinsecamente Unicode) - ma senza fortuna. Come faccio a eseguire un programma e passarlo un Unicode della riga di comando?

È stato utile?

Soluzione

Il mio background: Io uso Unicode input / output in una console per anni (e faccio un sacco quotidiano Inoltre, ho sviluppato strumenti di supporto per esattamente questo compito.). Ci sono pochissimi problemi, per quanto a comprendere i seguenti fatti / limitazioni:

  • CMD e “console” sono fattori estranei. CMD.exe è solo uno dei programmi che sono pronti a “lavorare dentro” una console ( “applicazioni console”).
  • per quanto ne so, CMD ha il supporto ideale per Unicode; è possibile inserire / uscita tutti i caratteri Unicode quando qualsiasi codepage è attivo.
  • console di Windows’ ha un sacco di supporto per Unicode - ma non è perfetto (solo ‘abbastanza buono’; vedi sotto)
  • .
  • chcp 65001 è molto pericoloso. A meno che un programma è stato appositamente progettato per risolvere i difetti di API di Windows’ (o utilizza una libreria di runtime C che ha queste soluzioni alternative), che non avrebbe funzionato in modo affidabile. Win8 risolve ½ di questi problemi con cp65001, ma il resto è ancora applicabile per Win10 .
  • Lavoro in cp1252. Come ho già detto:. Per input / output Unicode in una console, non c'è bisogno di impostare la tabella codici

I dettagli

  • Per leggere / scrivere Unicode a una console, un'applicazione (o la sua libreria di runtime C) dovrebbe essere abbastanza intelligente da utilizzare non File-I/O API, ma Console-I/O API. (Per un esempio, vedere come Python fa .)
  • Analogamente, per leggere gli argomenti Unicode riga di comando, un'applicazione (o dalla sua libreria di runtime C) dovrebbe essere abbastanza intelligente per utilizzare l'API corrispondente.
  • Console rendering dei font supporta solo i caratteri Unicode in formato BMP (in altre parole: sotto U+10000). Solo semplice rendering del testo è supportato (in modo europeo - e alcune Est asiatico - lingue dovrebbe funzionare bene - per quanto si usa forme precomposte). [C'è un stampa fine minore qui per l'Asia Orientale e per i caratteri U + 0000, U + 0001, U + 30FB. ]

Considerazioni pratiche

  • default sulla finestra non sono molto utili. Per una migliore esperienza, si dovrebbe accordare 3 pezzi di configurazione:

    • Per l'uscita: un font console completo. Per ottenere i migliori risultati, vi consiglio mia costruisce . (Le istruzioni di installazione sono presenti lì -. E anche elencati in altre risposte in questa pagina)
    • Per l'ingresso: un layout di tastiera capace. Per ottenere i migliori risultati, vi consiglio mio layout .
    • Per l'ingresso: consentire ingresso HEX di Unicode .
  • Un altro Gotcha con “incollare” in un'applicazione console (molto tecnico):

    • ingresso HEX offre un personaggio su KeyUp di Alt; tutti gli altri modi per offrire accadere un personaggio su KeyDown; così molte applicazioni non sono pronti a vedere un personaggio su KeyUp. (Solo per le applicazioni che utilizzano Console-I/O API.)
    • Conclusione:. Molte applicazioni, non avrebbe reagito in eventi di input HEX
    • Inoltre, ciò che accade con un carattere “incollata” dipende dal layout corrente di tastiera: se il carattere può essere digitato senza ausilio di chiavi prefisso (ma con arbitraria complicata combinazione di modificatori, come in Ctrl-Alt-AltGr-Kana-Shift-Gray*) allora è trasportato su un emulato pressione di un tasto. Questo è ciò che si aspetta che tutte le applicazioni -. Così incollare tutto ciò che contiene solo tali caratteri è bene
    • Tuttavia, gli “altri” personaggi vengono consegnati da emulando ingresso HEX .

    Conclusione : a meno che il layout di tastiera supporta l'ingresso di un sacco di personaggi senza chiavi prefisso, alcune applicazioni buggy possono saltare caratteri quando si Paste via del Console UI: Alt-Space E P. (Su Questo è il motivo per cui vi consiglio di usare il mio layout di tastiera!)

Si deve anche tenere a mente che il “alternativa, le console‘più capaci’” per Windows non sono console a tutti . Non supportano le API Console-I/O, in modo che i programmi che si basano su queste API per lavoro non sarebbe la funzione. (I programmi che usano solo “API / O di file-I del filehandles console” avrebbe funzionato bene, però.)

Un esempio di tale non da console è una parte della Powershell di Microsoft. Io non lo uso; di sperimentare, premere e rilasciare WinKey, quindi digitare powershell.


(D'altra parte, ci sono programmi come ConEmu o ANSICON che cercano di fare di più: essi‘ tentativo’per intercettare Console-I/O API a rendere‘applicazioni console vero’lavoro troppo Questo sicuramente lavora per programmi di esempio giocattolo;.. nella vita reale, questo può o non può risolvere i vostri problemi particolari Experiment)

Sommario

  • carattere impostato, layout di tastiera (e facoltativamente, permettere di ingresso HEX).

  • utilizzare solo programmi che passano attraverso le API Console-I/O, e accettano gli argomenti della riga di comando Unicode. Per esempio, ogni programma cygwin-compilato dovrebbe andare bene. Come ho già detto, CMD è troppo bella.

UPD: Inizialmente, per un bug in cp65001, stavo mescolando gli strati del kernel e CRTL ( UPD²: e modalità utente API di Windows!). anche: Win8 risolve la metà di questo bug; Ho chiarito la sezione sulla applicazione “meglio console”, e ha aggiunto un riferimento a come Python fa.

Altri suggerimenti

Prova:

chcp 65001

che cambierà la tabella codici UTF-8. Inoltre, è necessario utilizzare i font della console Lucida.

Ho avuto lo stesso problema (io sono dalla Repubblica Ceca). Ho un'installazione inglese di Windows, e devo lavorare con i file su un'unità condivisa. Percorsi dei file includono caratteri ceco-specifici.

La soluzione che funziona per me è:

Nel file batch, cambiare la pagina charset

La mia file batch:

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

Il file batch deve essere salvato in CP 1250.

Si noti che la console non mostrerà caratteri correttamente, ma li capirà ...

Controlla la lingua per programmi non Unicode. In caso di problemi con il russo nella console di Windows, allora si dovrebbe impostare russo qui:

Modifica della lingua per i programmi non Unicode

E 'abbastanza difficile per modificare il valore predefinito tabella codici di console di Windows. Quando si cerca il web a trovare diverse proposte, tuttavia alcuni di loro possono rompere il vostro Windows del tutto, vale a dire il PC non si avvia più.

La soluzione più sicura è questa: Vai al tuo Registro HKEY_CURRENT_USER\Software\Microsoft\Command Processor chiave e aggiungere valore String = Autorun chcp 65001.

In alternativa, è possibile utilizzare questo piccolo lotto-script per le tabelle codici più comuni.

@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
)

Utilizzando @chcp 65001>nul invece di chcp 65001 sopprime l'uscita "pagina di codice attivo: 65001" si otterrebbe ogni volta che si avvia una nuova finestra della riga di comando

.

Un elenco completo di tutti i numeri disponibili si può ottenere da Code Page identificatori

Nota, le impostazioni si applicheranno solo per l'utente corrente. Se vi piace impostare per tutti gli utenti, sostituire SET ROOT_KEY="HKEY_CURRENT_USER" riga per SET ROOT_KEY="HKEY_LOCAL_MACHINE"

In realtà, il trucco è che il prompt dei comandi in realtà capisce questi caratteri non inglesi, proprio non può visualizzare correttamente.

Quando entro un percorso nel prompt dei comandi che contiene alcuni chracters non in lingua inglese viene visualizzato come "?? ?????? ?????". Quando si invia il comando (cd "??? ?????? ?????" nel mio caso), tutto funziona come previsto.

Su una macchina x64 di Windows 10, ho fatto i caratteri di visualizzazione del prompt dei comandi non inglese:

Aprire un prompt dei comandi con privilegi elevati (eseguire cmd.exe come amministratore). Interrogare il registro per i font TrueType disponibili per la console:

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

Vedrete un output come:

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

Ora abbiamo bisogno di aggiungere un tipo di carattere TrueType che supporta i caratteri che servono come Courier New. Facciamo questo con l'aggiunta di zeri per il nome della stringa, quindi in questo caso il prossimo sarebbe "000":

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

Ora implementiamo il supporto UTF-8:

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

Set di carattere predefinito di "Courier New":

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

Imposta la dimensione del carattere a 20:

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

Abilita modifica veloce se vi piace:

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

Non ho visto alcuna risposta completa per Python 2.7, sarò delineare i due passi importanti e un passaggio facoltativo che è molto utile.

  1. Hai bisogno di un tipo di carattere con il supporto Unicode. Windows viene fornito con Lucida Console che possono essere selezionati da clic destro sulla barra del titolo di prompt dei comandi e scegliere l'opzione Defaults. Questo dà anche l'accesso ai colori. Si noti che è anche possibile modificare le impostazioni per finestre di comando invocati in un certo modo (per esempio, aprire qui, Visual Studio) scegliendo Properties invece.
  2. È necessario impostare la tabella codici per cp65001, che sembra essere il tentativo di Microsoft di offrire supporto UTF-7 e UTF-8 al prompt dei comandi. Fatelo eseguendo chcp 65001 nel prompt dei comandi . Una volta impostato, rimane in questo modo finché la finestra è chiusa. Avrete bisogno di rifare questo ogni volta che si lancia cmd.exe.

Per una soluzione più permanente, fare riferimento a questa risposta su Super User. In breve, creare una voce REG_SZ (String) utilizzando regedit a HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor e il nome AutoRun. Modificare il valore di esso per chcp 65001. Se non si desidera visualizzare il messaggio output del comando, utilizzare @chcp 65001>nul invece.

Alcuni programmi hanno difficoltà a interagire con questa codifica, MinGW essendo uno degno di nota che non riesce durante la compilazione con un messaggio di errore senza senso. Tuttavia, questo funziona molto bene e non causa bug con la maggior parte dei programmi.

Una davvero semplice opzione è quella di installare una shell bash di Windows come MinGW e l'uso che:

Inserire descrizione dell'immagine qui

C'è un po 'di una curva di apprendimento in quanto sarà necessario utilizzare la funzionalità della riga di comando di Unix, ma vi piacerà il potere di esso ed è possibile impostare il carattere di console impostato su UTF-8.

Inserire descrizione dell'immagine qui

Naturalmente si ottiene anche tutte le solite chicche * nix come grep, trovare, meno, ecc.

Per un problema simile, (il mio problema è stato quello di mostrare caratteri UTF-8 da MySQL su un prompt dei comandi),

ho risolto in questo modo:

  1. Ho cambiato il carattere del prompt dei comandi per Lucida Console. (Questo passaggio deve essere irrilevante per la situazione. Ha a che fare soltanto con quello che si vede sullo schermo e non con ciò che è veramente il personaggio).

  2. Ho cambiato la tabella codici di Windows 1253. A tale scopo, il prompt dei comandi "chcp 1253". Ha funzionato per il mio caso in cui volevo vedere UTF-8.

Ho trovato questo metodo come utili in nuove versioni di Windows 10:

attivare questa funzione: "Beta: Usa Unicode UTF-8 per il supporto delle lingue in tutto il mondo"

  

Pannello di controllo -> Opzioni internazionali -> tab- amministrativo> Cambia   impostazioni locali del sistema ...

Impostazioni regione

Il problema è abbastanza fastidioso. Di solito ho carattere cinese nel mio nome del file e file di contenuto. Si prega di notare che sto usando Windows 10, qui è la mia soluzione:

Per visualizzare il nome di file , come ad esempio dir o ls se avete installato Ubuntu bash su Windows 10

  1. Imposta la regione per sostenere non UTF 8 caratteri.

  2. Dopo di che, il font della console sarà cambiato al font di quel locale, e cambia anche la codifica della console.

Dopo aver fatto passi precedenti, al fine di visualizzare la il contenuto del file di un file UTF-8 utilizzando lo strumento da riga di comando

  1. Modificare la pagina utf-8 da chcp 65001
  2. Modifica per il tipo di carattere che supporta UTF-8, come ad esempio Lucida Console
  3. Comando Usa type di sbirciare il contenuto del file, o cat se avete installato Ubuntu bash su Windows 10
  4. Si prega di notare che, dopo aver impostato la codifica della console a UTF-8, non riesco a digitare caratteri cinesi nel cmd utilizzando il metodo di input cinese.

La soluzione più pigri: Basta usare un emulatore di console come http://cmder.net/

Una decisione rapida per i file .bat, se il computer visualizza il nome del percorso / file corretto quando si digita in DOS-finestra:

  1. copy con temp.txt [premere Invio]
  2. Digitare il nome del percorso / file [premere Invio]
  3. Premi Ctrl-Z [premere Invio]

In questo modo si crea un file .txt - temp.txt. Aprirlo nel Blocco note, copiare il testo (non preoccupatevi sembrerà illeggibile) e incollarlo nel file .bat. L'esecuzione del bat creato in questo modo in DOS-window lavorato per mе (cirillico, bulgaro).

Una cosa migliore da fare più pulito: Basta installare il, libero, Microsoft lingua giapponese pack disponibile. (Altri pacchetti linguistici orientali potranno anche funzionare, ma ho provato quello giapponese.)

Questo vi dà i caratteri con i più grandi gruppi di glifi, li rende il comportamento di default, cambia i vari strumenti di Windows come cmd, WordPad, ecc.

Modifica della pagina di codice al 1252 sta lavorando per me. Il problema per me è il simbolo della doppia doller § è la conversione ad un altro simbolo da DOS su Windows Server 2008.

Ho usato CHCP 1252 e un tappo prima che nella mia dichiarazione BCP ^ §.

vedo più risposte qui, ma non sembrano affrontare la questione - che l'utente desidera ricevere input Unicode dalla riga di comando

.

Windows utilizza UTF-16 per la codifica in due stringhe di byte, quindi è necessario ottenere questi dal sistema operativo nel vostro programma. Ci sono due modi per fare questo -

1) Microsoft ha un'estensione che permette principale per prendere una vasta gamma di caratteri:    int wmain (int argc, wchar_t * argv []);     https://msdn.microsoft.com/en-us/library/6wd819wh. aspx

2) Chiamare le API di Windows per ottenere la versione Unicode della riga di comando    wchar_t win_argv = (wchar_t ) CommandLineToArgvW (GetCommandLineW (), e nargs);     https://docs.microsoft.com/ en-us / windows / desktop / api / shellapi / NF-shellapi-commandlinetoargvw

Leggere questo: http://utf8everywhere.org per informazioni dettagliate, in particolare se si stanno sostenendo altri sistemi operativi.

A partire giugno 2019, con Windows 10, non sarà necessario modificare la tabella di codici.

Vedere " Introduzione a Windows Terminal " (da Kayla cannella ) e il Microsoft / terminale .
Attraverso l'uso del carattere Consolas, parziale sarà fornito supporto Unicode.

Come documentato in Microsoft/Terminal problema 387 :

  

Ci sono 87,887 ideogrammi attualmente in Unicode. Avete bisogno di tutti loro?
  Abbiamo bisogno di un confine, e caratteri oltre quel confine dovrebbe essere gestita dal carattere di ripiego / font linking / qualunque cosa.

     

Cosa Consolas dovrebbe coprire:

     
      
  • I caratteri utilizzati come simboli utilizzati dai moderni programmi OSS nella CLI.
  •   
  • Questi personaggi dovrebbero seguire la progettazione e metriche Consolas', e correttamente allineato con i caratteri Consolas esistenti.
  •   
     

Cosa Consolas non dovrebbe comprendere:

     
      
  • I personaggi e la punteggiatura di script che al di là di latino, greco e cirillico, soprattutto personaggi hanno bisogno di sagomatura complessa (come l'arabo).
  •   
  • Questi caratteri devono essere maneggiati con carattere di ripiego.
  •   

ho ottenuto intorno ad un problema simile l'eliminazione di file Unicode-nominati facendo riferimento ad essi nel file batch con le loro (3 8 punti) nomi brevi.

I nomi brevi possono essere visualizzate facendo dir /x. Ovviamente, questo funziona solo con i nomi di file Unicode che sono già note.

Per utf-8: chcp 65001

Torna al default: chcp 437

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top