เปลี่ยนหน้ารหัสเริ่มต้นของคอนโซล 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 ซอฟต์แวร์ใด ๆ ที่ใช้จำนวนเอาต์พุตของ Win32 WriteFile / ReadFile APIs จะได้รับผลลัพธ์ที่ไม่ถูกต้อง การใช้ stdlib จะสร้างเอาต์พุต mangled / ซ้ำและแขวนบนอินพุตเมื่อเผชิญหน้ากับที่ไม่ใช่ ASCII จนกระทั่ง MS ได้รับรอบเพื่อแก้ไขมัน - และจะได้รับทศวรรษที่ผ่านมามีสัญลักษณ์ของสิ่งที่เกิดขึ้นว่าไม่มี - ทั่วโลกเปลี่ยนหน้ารหัสคอนโซล 65001 เป็นความคิดที่ดีเป็นพิเศษ
bobince

2
การใช้งานAฟังก์ชั่นเวอร์ชั่น Windows ใด ๆ จะใช้งานไม่ได้ รหัสทั้งหมดจะต้องได้รับการพอร์ตเพื่อใช้Wเวอร์ชัน
Demi

1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage\OEMCPถูกใช้เป็นทางเลือกสำหรับสภาพแวดล้อมที่ไม่ใช่ยูนิโค้ด (ไม่ใช่ utf) แน่นอนว่าคุณพยายามบังคับให้เป็น 'ยูนิโค้ด' ตามที่คุณเห็นว่ามันขัดแย้งกันโดยคำจำกัดความ Windows อาจหยุดทำงานเนื่องจากบางอย่างของระบบเมื่อบู๊ตขึ้นอยู่กับชุดอักขระที่ไม่ใช่ยูนิโค้ดในการทำงาน
venimus

คำตอบ:


99

เมื่อต้องการเปลี่ยนเพจรหัสสำหรับคอนโซลเท่านั้นให้ทำดังต่อไปนี้:

  1. เริ่ม -> Run -> 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
Dacto

1
@ Dr.jacky ไม่แน่ใจว่าสิ่งที่พวกเขาหมายถึงอันตราย ฉันเพิ่งตอบคำถามของ OP ไม่ว่าคุณควรทำหรือไม่เป็นคำถามที่แตกต่าง ฉันเชื่อว่าอาจมีปัญหาบางอย่างกับ Python ดังนั้นคุณอาจต้องการตรวจสอบว่าก่อนที่จะตั้งค่าเพจรหัสเป็น 65001 อย่างน้อย
Nils Magne Lunde

38

ส่วนตัวฉันไม่ชอบการเปลี่ยนแปลงรีจิสทรี นี่อาจทำให้เกิดปัญหามากมาย ฉันสร้างไฟล์แบตช์:

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

ฉันบันทึกที่C:\Windows\System32switch.bat

ฉันสร้างลิงค์สำหรับ cmd.exe บนเดสก์ท็อป

ในคุณสมบัติของทางลัด cmd เปลี่ยนปลายทางเป็น: C:\Windows\System32\cmd.exe /k switch

ใช่, เมื่อฉันต้องการพิมพ์ใน UTF-8 ฉันใช้ลิงค์นี้


7
โปรดทราบว่ามันจะพิมพ์Active code page: 65001ไปยัง stdout ดังนั้นถ้าคุณทำอะไรแบบCHCP 65001 && mycommand.exeนั้นคุณจะได้รับเพจรหัสที่พิมพ์ออกมาตอนเริ่ม คุณต้องCHCP 65001 >nul && mycommand.exe
frumbert

32

ไฟล์ Reg:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe]
"CodePage"=dword:fde9
  1. ค่าต้องเป็นเลขฐานสิบหก
  2. จะต้องรวมบรรทัดบนสุดอย่างที่เป็น
  3. HKEY_CURRENT_USER ไม่สามารถย่อได้
  4. ไม่สามารถละเว้น dword

พร้อมรับคำสั่ง:

REG ADD HKCU\Console\%SystemRoot^%_system32_cmd.exe /v CodePage /t REG_DWORD /d 65001
  1. ค่าสามารถอยู่ใน dec หรือ hex
  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. ค่าสามารถอยู่ใน dec หรือ hex
  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. ค่าสามารถอยู่ใน dec หรือ hex
  2. สามารถใช้ / -> \
  3. สามารถใช้ HKCU -> HKEY_CURRENT_USER
  4. สามารถใช้ user -> HKEY_CURRENT_USER

ไม่ทำงานใน Windows 10 สิ่งที่ทำงานคือการสร้างการทำงานอัตโนมัติที่ตั้งค่าเพจรหัสผ่านคำสั่ง chcpEg,
George

สิ่งที่ฉันหมายถึงก่อนที่จะหมดเวลาแก้ไขหยาบคายคือปัญหาchcp 65001ในไฟล์คำสั่งการทำงานอัตโนมัติ ดูstackoverflow.com/a/17405182/315083
George

สิ่งนี้คือมันใช้งานได้กับ CMD เท่านั้น แต่ไม่ใช่สำหรับคอนโซลด้วยตัวเอง
AnrDaemon

5

chcp <codepage>คำสั่งที่จะเปลี่ยนเพจรหัสคือ ตัวอย่าง: chcp 1252. คุณควรพิมพ์ลงในหน้าต่าง Powershell เพื่อหลีกเลี่ยงความยุ่งยากในการพิมพ์ทุกครั้ง (หากคุณจำเป็นต้องเปลี่ยนรหัสเพจ) คุณอาจผนวกมันไว้ในบรรทัดคำสั่งของโปรแกรม โดยทำตามขั้นตอนต่อไปนี้:

  1. คลิกขวาที่ไอคอน Powershell บนเมนู Start แล้วเลือก "More"> "Open file Location"
  2. คลิกขวาที่ทางลัด Powershell และเลือก "Properties"
  3. เพิ่มต่อไปนี้ในตอนท้ายของบรรทัดคำสั่ง "เป้าหมาย": -NoExit -Command "chcp 1252"

มีความสุข อย่าวุ่นวายกับ Windows Registry เว้นแต่คุณจะไม่มีตัวเลือกอื่น


อันนี้ใช้ได้ดีกับฉัน -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 Explorer


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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.