Cambia la tabella codici predefinita della console di Windows in UTF-8


123

Attualmente sto usando Windows 7 x64 e di solito voglio che tutti gli strumenti della console funzionino con UTF-8 piuttosto che con la tabella codici predefinita 850.

L'esecuzione chcp 65001nel prompt dei comandi prima dell'uso di qualsiasi strumento aiuta, ma esiste un modo per impostare è come tabella codici predefinita?

Aggiornare:

Modificare il HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCPvalore in modo che 65001appaia nel mio caso impossibile avviare il sistema.

Proposta di modifica HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorunalla @chcp 65001>nulservito solo bene per il mio scopo. (grazie a Ole_Brun )


Si noti che la soluzione proposta potrebbe interrompere Windows 'find.exe (che causerebbe problemi con la build dell'SDK Android): superuser.com/questions/176737/…
J Rao,

Hm, quando utilizzo chcp 65001 la mia console si blocca quando faccio dir, ma aiuta semplicemente a avviare cmd.exe con il flag / u (nb: usa unicode perché non si riflette nell'output di chcp.com)
eckes

10
La console di Windows è piena di bug quando la codifica è impostata su una codepage multi-byte non supportata come 65001. Qualsiasi software che utilizza i conteggi di output delle API Win32 WriteFile / ReadFile otterrà risultati errati e di conseguenza cose basate su come MSVCRT l'implementazione di stdlib produrrà output alterati / ripetuti e si bloccherà su input se confrontati con non-ASCII. Fino a quando MS non ha risolto il problema, e sono passati decenni senza che ciò accada, cambiare globalmente la code page della console su 65001 è una pessima idea .
Bobince,

2
Qualsiasi utilizzo delle Aversioni delle funzioni di Windows è interrotto. È necessario eseguire il porting di tutto il codice per utilizzare le Wversioni.
Demi

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCPviene utilizzato come fallback per ambienti non unicode (non utf), ovviamente si tenta di forzarlo a un "unicode", poiché si vede che è controverso per definizione. Windows si blocca probabilmente perché alcune cose di sistema all'avvio dipendono dal set di caratteri non Unicode per funzionare.
venimus,

Risposte:


99

Per modificare la tabella codici solo per la console, attenersi alla seguente procedura:

  1. Avvia -> Esegui -> regedit
  2. Vai a [HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorun]
  3. Cambia il valore in chcp 65001

1
@Regent Nella domanda, il valore di registro che hai citato che ha funzionato per te è @chcp 65001>nul, mentre in questa risposta accettata lo è chcp 65001. Quali sono le differenze tra i due?
galacticninja

7
La semplice messa in atto di @galacticninja chcp 65001farà sì che ogni prompt dei comandi aperto stampi 'Pagina codice attiva: 65001' @chcp 65001>nulimpedendo qualsiasi output.
Regent

7
Autorunnon è presente per me in Windows 8.1.
Kleinfreund,

2
@kleinfreund @Luke: se Autorunnon è presente, è possibile aggiungere un nuovo valore di stringa con il contenuto di@chcp 65001>nul
Dacto

1
@ Dr.jacky Non so esattamente cosa significhino con pericoloso. Ho appena risposto alla domanda del PO. Se dovresti farlo o no è una domanda diversa. Credo che potrebbero esserci dei problemi con Python, quindi potresti voler dare un'occhiata prima di impostare la tabella codici su 65001 almeno.
Nils Magne Lunde,

38

Personalmente, non mi piace cambiare il registro. Ciò può causare molti problemi. Ho creato un file batch:

@ECHO OFF
REM change CHCP to UTF-8
CHCP 65001
CLS

Ho salvato C:\Windows\System32come switch.bat.

Ho creato un collegamento per cmd.exe sul desktop.

Nelle proprietà del collegamento cmd, è stata modificata la destinazione in: C:\Windows\System32\cmd.exe /k switch

Voilá, quando devo digitare UTF-8, utilizzo questo link.


7
Si noti che verrà stampato Active code page: 65001su stdout. Quindi, se stai facendo qualcosa del genere CHCP 65001 && mycommand.exe, otterrai la codepage stampata all'inizio. È necessarioCHCP 65001 >nul && mycommand.exe
frumbert

32

File reg:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"CodePage"=dword:fde9
  1. Il valore deve essere in esadecimale
  2. La linea superiore deve essere inclusa esattamente come è
  3. HKEY_CURRENT_USER non può essere abbreviato
  4. dword non può essere omesso

Prompt dei comandi:

REG ADD HKCU\Console\%SystemRoot^%_system32_cmd.exe /v CodePage /t REG_DWORD /d 65001
  1. Il valore può essere in dec o esadecimale
  2. % SystemRoot% deve essere salvato
  3. REG_DWORD non può essere omesso

PowerShell:

New-Item -ErrorAction Ignore HKCU:\Console\%SystemRoot%_system32_cmd.exe
Set-ItemProperty HKCU:\Console\%SystemRoot%_system32_cmd.exe CodePage 65001
  1. Il valore può essere in dec o esadecimale
  2. -Type DWord è assunto con PowerShell 3+
  3. Poter usare ni -> New-Item
  4. Poter usare sp -> Set-ItemProperty
  5. Poter usare -ea 0 -> -ErrorAction Ignore

Cygwin:

regtool add '\HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe'
regtool set '\HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe\CodePage' 65001
  1. Il valore può essere in dec o esadecimale
  2. Poter usare / -> \
  3. Poter usare HKCU -> HKEY_CURRENT_USER
  4. Poter usare user -> HKEY_CURRENT_USER

Non ha funzionato in Windows 10. Quello che funziona è creare un autorun che imposta la tabella codici tramite il comando chcp.Eg,
George

Quello che intendevo dire prima che il tempo di modifica scadesse bruscamente era, problema chcp 65001in un file di comando di esecuzione automatica. Vedi stackoverflow.com/a/17405182/315083
George

Il fatto è che funziona solo per CMD, ma non per console da solo.
AnrDaemon

5

Il comando per modificare la tabella codici è chcp <codepage>. Esempio: chcp 1252. Dovresti inserirlo in una finestra di Powershell. Per evitare il fastidio di digitarlo ogni volta (se devi sempre cambiare la tabella codici), puoi aggiungerlo alla riga di comando del programma. Per fare ciò, attenersi alla seguente procedura:

  1. Fare clic con il tasto destro sull'icona Powershell nel menu Start e selezionare "Altro"> "Apri posizione file".
  2. Fare clic con il tasto destro del mouse sul collegamento Powershell e selezionare "Proprietà".
  3. Aggiungi quanto segue alla fine della riga di comando "Destinazione": -NoExit -Command "chcp 1252"

Siate felici. Non agitarti con il registro di Windows a meno che tu non abbia altre opzioni.


Questo ha funzionato perfettamente per me. -NoExit -Command "chcp 1252 > null"omette anche il messaggio sulla tabella codici selezionata all'inizio.
CodeMonkey,

5

Questo può essere fatto creando un profilo PowerShell e aggiungendo il comando "chcp 65001> $ null":

PS> Set-ExecutionPolicy RemoteSigned
PS> New-Item -Path $Profile -ItemType file -Force
PS> notepad $Profile

Ciò non richiede la modifica del registro e, diversamente dalla modifica di un collegamento, funzionerà se PowerShell viene avviato in una cartella specifica utilizzando il menu di scelta rapida di Windows Explorer.


1
@PimpJuiceIT, no .. vedi la prima riga di questa risposta.
Dacto,

4

Nella build del 1809 di Windows 10 sono riuscito a risolverlo definitivamente andando sul sistema Language settings, selezionando Administrative language settings, facendo clic Change system locale...e selezionando la Beta: Use Unicode UTF-8 for worldwide language supportcasella e quindi riavviando il mio PC.

In questo modo si applica a tutte le applicazioni, anche a quelle che non avvio da un prompt dei comandi!
(Il che è stato necessario per me, dal momento che stavo cercando di modificare il codice Agda da Atom.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.