Изменить кодовую страницу консоли Windows по умолчанию на UTF-8

123

В настоящее время я использую Windows 7 x64, и обычно я хочу, чтобы все консольные инструменты работали с UTF-8, а не с кодовой страницей по умолчанию 850.

chcp 65001Помогает запуск в командной строке перед использованием каких-либо инструментов, но есть ли способ установить его как кодовую страницу по умолчанию?

Обновить:

Изменение HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCPзначения, чтобы 65001появилось, чтобы система не могла загрузиться в моем случае.

Предлагаемое изменение, HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorunчтобы @chcp 65001>nulслужить просто хорошо для моей цели. (спасибо Ole_Brun )

Регент
источник
Обратите внимание, что это решение может привести к поломке Windows 'find.exe (что может вызвать проблемы со сборкой Android SDK): superuser.com/questions/176737/…
J Rao
Хм, когда я использую chcp 65001, мой консольный Windows вылетает, когда я делаю dir, но это помогает просто запустить cmd.exe с флагом / u (nb: он действительно использует unicode, это не отражается в выводе chcp.com)
eckes
10
Консоль Windows изобилует ошибками, когда кодировка установлена ​​на неподдерживаемую многобайтовую кодовую страницу, такую ​​как 65001. Любое программное обеспечение, использующее выходные значения API Win32 WriteFile / ReadFile, получит неправильные результаты, и, следовательно, что-то построенное на этом, как MSVCRT реализация stdlib будет производить искаженный / повторяющийся вывод и зависать на вводе, когда сталкивается с не-ASCII. До тех пор, пока MS не приступит к ее исправлению - и это были десятилетия, когда не было никаких признаков этого - глобальное изменение кодовой страницы консоли на 65001 является чрезвычайно плохой идеей .
bobince
2
Любое использование Aверсий функций Windows нарушено. Весь код должен быть перенесен для использования Wверсий.
Деми
1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCPиспользуются в качестве запасного варианта для не-юникода (не UTF) сред, очевидно , вы пытаетесь заставить его в «Юникод», как вы видите , это controversal по определению. Windows зависает, вероятно, потому что некоторые системные вещи при загрузке зависят от работы не-Unicode-кодировки.
Веним

Ответы:

99

Чтобы изменить кодовую страницу только для консоли, выполните следующие действия:

  1. Пуск -> Выполнить -> regedit
  2. Перейти к [HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\Autorun]
  3. Измените значение на chcp 65001
Нильс Магне Лунде
источник
1
@Regent В этом вопросе значение реестра, которое вы упомянули, сработало для вас @chcp 65001>nul, в то время как в этом принятом ответе это так chcp 65001. Каковы различия между этими двумя?
galacticninja
7
Простое размещение @galacticninja chcp 65001приведет к тому, что в каждой открытой командной строке будет напечатано «Активная кодовая страница: 65001», а @chcp 65001>nulвсякие выходные данные будут запрещены.
Регент
7
Autorunнет для меня под Windows 8.1.
kleinfreund
2
@kleinfreund @Luke: если Autorunнет, вы можете добавить новое @chcp 65001>nul
строковое
1
@ Dr.jacky Не знаю точно, что они имеют в виду под опасным. Я только что ответил на вопрос ОП. Должны ли вы сделать это или нет, это другой вопрос. Я полагаю, что могут быть некоторые проблемы с Python, поэтому вы можете проверить это, прежде чем устанавливать кодовую страницу как минимум на 65001.
Нильс Магне Лунде
38

Лично мне не нравится смена реестра. Это может вызвать много проблем. Я создал командный файл:

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

Я сохранил C:\Windows\System32как switch.bat.

Я создал ссылку для cmd.exe на рабочем столе.

В свойствах ярлыка cmd изменил место назначения на: C:\Windows\System32\cmd.exe /k switch

Вуаля, когда мне нужно набрать UTF-8, я использую эту ссылку.

Жука
источник
7
Обратите внимание, что он будет печатать Active code page: 65001на стандартный вывод. Так что если вы делаете что-то вроде CHCP 65001 && mycommand.exeэтого, вы получите распечатанную кодовую страницу в начале. Вы должныCHCP 65001 >nul && mycommand.exe
frumbert
32

Рег файл:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"CodePage"=dword:fde9
  1. Значение должно быть в шестнадцатеричном
  2. Верхняя строка должна быть включена в точности как есть
  3. HKEY_CURRENT_USER не может быть сокращено
  4. меч не может быть опущен

Командная строка:

REG ADD HKCU\Console\%SystemRoot^%_system32_cmd.exe /v CodePage /t REG_DWORD /d 65001
  1. Значение может быть в декабре или шестнадцатеричном
  2. % SystemRoot% должен быть экранирован
  3. REG_DWORD нельзя опускать

PowerShell:

New-Item -ErrorAction Ignore HKCU:\Console\%SystemRoot%_system32_cmd.exe
Set-ItemProperty HKCU:\Console\%SystemRoot%_system32_cmd.exe CodePage 65001
  1. Значение может быть в декабре или шестнадцатеричном
  2. -Type DWord предполагается с PowerShell 3+
  3. Можно использовать ni -> New-Item
  4. Можно использовать sp -> Set-ItemProperty
  5. Можно использовать -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. Значение может быть в декабре или шестнадцатеричном
  2. Можно использовать / -> \
  3. Можно использовать HKCU -> HKEY_CURRENT_USER
  4. Можно использовать user -> HKEY_CURRENT_USER
Стивен Пенни
источник
Не работал в Windows 10. Что работает, так это создание автозапуска, который устанавливает кодовую страницу с помощью команды chcp. Например,
Джордж
Перед грубым истечением времени редактирования я хотел сказать, что проблема chcp 65001в командном файле автозапуска. См. Stackoverflow.com/a/17405182/315083
Джордж
Дело в том, что он работает только для CMD, но не для консоли.
AnrDaemon
5

Команда для изменения кодовой страницы есть chcp <codepage>. Пример: chcp 1252. Вы должны напечатать это в окне Powershell. Чтобы избежать необходимости набирать его каждый раз (если вам всегда приходится менять кодовую страницу), вы можете добавить его в командную строку программы. Для этого выполните следующие действия:

  1. Щелкните правой кнопкой мыши значок Powershell в меню «Пуск» и выберите «Дополнительно»> «Расположение файла».
  2. Щелкните правой кнопкой мыши ярлык Powershell и выберите «Свойства».
  3. Добавьте следующее в конец командной строки «Target»: -NoExit -Command "chcp 1252"

Будь счастлив. Не суетитесь с реестром Windows, если у вас нет другого выбора.

JColares
источник
Этот работал отлично для меня. -NoExit -Command "chcp 1252 > null"также пропускает сообщение о выбранной кодовой странице в начале.
CodeMonkey
5

Это можно сделать, создав профиль PowerShell и добавив в него команду «chcp 65001> $ null»:

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

Это не требует редактирования реестра и, в отличие от редактирования ярлыка, будет работать, если PowerShell запускается в определенной папке с помощью контекстного меню проводника Windows.

Фреон Сандоз
источник
1
@PimpJuiceIT, нет .. см. Первую строку этого ответа.
Dacto
4

В 1809 сборке Windows 10 мне удалось решить эту проблему навсегда, перейдя в систему Language settings, выбрав Administrative language settings, нажав Change system locale...и установив Beta: Use Unicode UTF-8 for worldwide language supportфлажок, а затем перезагрузив мой компьютер.

Таким образом, это относится ко всем приложениям, даже к тем, которые я не запускаю из командной строки!
(Что было необходимо для меня, так как я пытался редактировать код Agda из Atom.)

Isti115
источник