วิธีการใช้อักขระ Unicode ในบรรทัดคำสั่งของ Windows


316

เรามีโครงการใน Team Foundation Server (TFS) ที่มีตัวอักษรที่ไม่ใช่ภาษาอังกฤษ (š) อยู่ในนั้น เมื่อพยายามเขียนสคริปต์สิ่งที่เกี่ยวกับงานสร้างเราพบปัญหาเราไม่สามารถส่งจดหมายšไปยังเครื่องมือบรรทัดคำสั่งได้ พรอมต์คำสั่งหรือสิ่งอื่น ๆ ไม่ยุ่งและยูทิลิตี้tf.exeไม่สามารถหาโครงการที่ระบุ

ฉันได้ลองรูปแบบที่แตกต่างกันสำหรับไฟล์. bat (ANSI, UTF-8 ที่มีและไม่มีBOM ) รวมถึงการเขียนสคริปต์ใน JavaScript (ซึ่งเป็น Unicode โดยเนื้อแท้) - แต่ไม่มีโชค ฉันจะรันโปรแกรมและส่งผ่านบรรทัดคำสั่งUnicode ได้อย่างไร


1
@JohannesDewender - คัดลอกแปะผิดหรือเปล่า?
Vilx-

2
Python 3.6: "คอนโซลเริ่มต้นบน Windows ยอมรับอักขระ Unicode ทั้งหมดที่มีรุ่นนั้น" (ส่วนใหญ่สำหรับฉัน) แต่คุณต้องกำหนดค่าคอนโซล: คลิกขวาที่ด้านบนของหน้าต่าง (ของ cmd หรือ python IDLE ) โดยค่าเริ่มต้น / แบบอักษรให้เลือก "Lucida console"
JinSnow



2
@ LưuVĩnhPhúc - ไม่นี่เป็นเรื่องเกี่ยวกับการส่งผ่านอาร์กิวเมนต์บรรทัดคำสั่งแบบ Unicode แทนที่จะแสดงข้อความในคอนโซล คอนโซลอาจไม่เกี่ยวข้องเลย
Vilx-

คำตอบ:


68

พื้นหลังของฉัน: ฉันใช้ Unicode อินพุต / เอาต์พุตในคอนโซลเป็นเวลาหลายปี (และทำมันทุกวันนอกจากนี้ฉันพัฒนาเครื่องมือสนับสนุนสำหรับงานนี้อย่างแน่นอน) มีปัญหาน้อยมากเท่าที่คุณเข้าใจข้อเท็จจริง / ข้อ จำกัด ต่อไปนี้:

  • CMDและ "คอนโซล" เป็นปัจจัยที่ไม่เกี่ยวข้อง CMD.exeเป็นหนึ่งในโปรแกรมที่พร้อมที่จะ "ทำงานภายใน" คอนโซล ("แอปพลิเคชันคอนโซล")
  • AFAIK CMDมีการสนับสนุนที่สมบูรณ์แบบสำหรับ Unicode; คุณสามารถป้อน / เอาต์พุตตัวอักษร Unicode ทั้งหมดเมื่อเพจรหัสใด ๆทำงานอยู่
  • คอนโซล Windows มีการสนับสนุน Unicode มากมาย - แต่ก็ไม่สมบูรณ์แบบ (เพียงแค่“ ดีพอ”; ดูด้านล่าง)
  • chcp 65001มันอันตรายมาก หากโปรแกรมไม่ได้รับการออกแบบมาเป็นพิเศษเพื่อแก้ไขข้อบกพร่องใน API ของ Windows (หรือใช้ C runtime library ซึ่งมีวิธีแก้ปัญหาเหล่านี้) มันจะไม่ทำงานอย่างน่าเชื่อถือ แก้ไข Win8 ½ของปัญหาเหล่านี้มีcp65001แต่ส่วนที่เหลือยังคงใช้บังคับกับ Win10
  • cp1252ผมทำงานใน ขณะที่ผมอยู่แล้วกล่าวว่า: การอินพุต / เอาต์พุต Unicode ในคอนโซลหนึ่งไม่จำเป็นต้องตั้งเพจรหัส

รายละเอียด

  • ในการอ่าน / เขียน Unicode ไปยังคอนโซลแอปพลิเคชั่น (หรือไลบรารี C runtime) ควรจะฉลาดพอที่จะใช้ไม่ใช่File-I/OAPI แต่เป็นConsole-I/OAPI (สำหรับตัวอย่างดูว่า Python ทำมันได้อย่างไร)
  • ในการอ่านอาร์กิวเมนต์บรรทัดคำสั่ง Unicode แอปพลิเคชัน (หรือไลบรารีรันไทม์ C) ควรฉลาดพอที่จะใช้ API ที่สอดคล้องกัน
  • การแสดงแบบอักษรของคอนโซลรองรับเฉพาะอักขระ Unicode ใน BMP (กล่าวอีกนัยหนึ่ง: ด้านล่างU+10000) สนับสนุนการแสดงข้อความอย่างง่ายเท่านั้น (ดังนั้นในยุโรป - และเอเชียตะวันออก - ภาษาบางภาษาควรทำงานได้ดี - ตราบใดที่หนึ่งใช้แบบฟอร์ม precomposed) [มีการพิมพ์รายละเอียดเล็กน้อยสำหรับเอเชียตะวันออกและสำหรับตัวอักษร U + 0000, U + 0001, U + 30FB]

ข้อควรพิจารณาในทางปฏิบัติ

  • ค่าเริ่มต้นบนหน้าต่างจะไม่เป็นประโยชน์มาก เพื่อประสบการณ์ที่ดีที่สุดคุณควรปรับแต่งการกำหนดค่า 3 ชิ้น

    • สำหรับเอาต์พุต: ฟอนต์คอนโซลที่ครอบคลุม เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดผมขอแนะนำให้สร้างของฉัน (มีคำแนะนำในการติดตั้งอยู่ที่นั่น - และแสดงไว้ในคำตอบอื่น ๆ ในหน้านี้ด้วย)
    • สำหรับอินพุต: เค้าโครงแป้นพิมพ์ที่มีความสามารถ เพื่อให้ได้ผลลัพธ์ที่ดีที่สุดผมขอแนะนำรูปแบบของฉัน
    • สำหรับการป้อนข้อมูล: ช่วยให้การป้อนข้อมูลของ HEX Unicode
  • gotcha อีกหนึ่งรายการที่มี“ การวาง” ลงในแอปพลิเคชันคอนโซล (ด้านเทคนิคมาก):

    • อินพุต HEX ให้อักขระบนKeyUpของAlt; ทุกวิธีการอื่น ๆ เพื่อส่งตัวละครที่เกิดขึ้นในKeyDown; KeyUpเพื่อให้การใช้งานจำนวนมากไม่พร้อมที่จะเห็นตัวอักษรบน (ใช้ได้กับแอปพลิเคชันที่ใช้Console-I/OAPI เท่านั้น)
    • สรุป: แอปพลิเคชันจำนวนมากจะไม่ตอบสนองต่อเหตุการณ์อินพุต HEX
    • นอกจากนี้สิ่งที่เกิดขึ้นด้วย“วาง” ตัวอักษรขึ้นอยู่กับรูปแบบแป้นพิมพ์ในปัจจุบัน: ถ้าตัวอักษรที่สามารถพิมพ์โดยไม่ต้องใช้กุญแจคำนำหน้า ( แต่มีการรวมกันที่ซับซ้อนโดยพลการของการปรับเปลี่ยนในขณะที่Ctrl-Alt-AltGr-Kana-Shift-Gray*) แล้วมันจะถูกส่งบนปุ่มกดเทิดทูน นี่คือสิ่งที่แอปพลิเคชันคาดหวัง - ดังนั้นการวางสิ่งใดก็ตามที่มีเพียงตัวอักษรดังกล่าวถือว่าใช้ได้
    • แต่ตัวละคร“อื่น ๆ” จะถูกส่งโดยลอกเลียนแบบการป้อนข้อมูล HEX

    สรุป : เว้นแต่แป้นพิมพ์รูปแบบรองรับการป้อนข้อมูลของคุณจำนวนมากของตัวละครโดยไม่ต้องคีย์คำนำหน้าบางโปรแกรมที่รถอาจข้ามตัวละครเมื่อคุณPasteผ่าน UI Alt-Space E Pคอนโซลของ: (นี่คือเหตุผลที่ฉันแนะนำให้ใช้รูปแบบแป้นพิมพ์ของฉัน!)

เราควรระลึกไว้เสมอว่า "คอนโซลทางเลือก" ที่มีความสามารถมากกว่า "สำหรับ Windows ไม่ใช่คอนโซลเลย พวกเขาไม่สนับสนุนConsole-I/OAPI ดังนั้นโปรแกรมที่ใช้ API เหล่านี้ในการทำงานจะไม่ทำงาน (โปรแกรมที่ใช้เฉพาะ "File-I / O APIs กับ filehandles คอนโซล" จะทำงานได้ดี)

Powershellตัวอย่างหนึ่งของที่ไม่ใช่คอนโซลเป็นส่วนหนึ่งของไมโครซอฟท์ ฉันไม่ได้ใช้มัน; การทดลองกดและปล่อยแล้วพิมพ์WinKeypowershell


(ในทางกลับกันมีหลายโปรแกรมเช่นConEmuหรือANSICONพยายามทำอะไรมากกว่านี้: พวกเขา“ พยายาม” ที่จะสกัดกั้นConsole-I/OAPI เพื่อให้“ แอปพลิเคชันคอนโซลที่แท้จริง” ทำงานได้เช่นกันการทำงานนี้เหมาะสำหรับโปรแกรมตัวอย่างของเล่นในชีวิตจริง อาจไม่สามารถแก้ปัญหาเฉพาะของคุณได้การทดลอง)

สรุป

  • ตั้งค่าแบบอักษรเค้าโครงแป้นพิมพ์ (และเป็นทางเลือกอนุญาตให้ใช้ HEX)

  • ใช้เฉพาะโปรแกรมที่ผ่านConsole-I/OAPIs และยอมรับอาร์กิวเมนต์บรรทัดคำสั่ง Unicode ตัวอย่างเช่นcygwinโปรแกรมใด ๆ ที่คอมไพล์ควรจะดี ขณะที่ผมแล้วกล่าวว่าCMDดีเกินไป

UPD:เริ่มแรกสำหรับข้อบกพร่องcp65001ฉันได้ผสมเลเยอร์เคอร์เนลและ CRTL ( UPD²:และ API โหมดผู้ใช้ Windows!) ยัง: Win8 แก้ไขครึ่งหนึ่งของข้อผิดพลาดนี้; ฉันชี้แจงส่วนเกี่ยวกับแอปพลิเคชั่น "ดีกว่าคอนโซล" และเพิ่มการอ้างอิงถึงวิธีการที่ Python ใช้งาน


ตกลงสำหรับบางสิ่งบางอย่างนี้คุณควรได้รับคำตอบ! ! น่ากลัว
Vilx-

5
ฉันเป็นมือใหม่สำหรับ C ++ และไม่สามารถเข้าใจคำตอบนี้หลังจากอ่านอย่างระมัดระวัง ใครสามารถช่วยฉันเกี่ยวกับเรื่องนี้หรืออธิบายได้ง่ายขึ้น?
Rick

@Bachi ขอบคุณ Bachi ฉันพบว่ารูปแบบแป้นพิมพ์ของฉัน (ดังกล่าวข้างต้น) v73 ขาดไฟล์สนับสนุนบางส่วน แก้ไขแล้ว! (ตัดสินโดย.logไฟล์ของฉันมันเป็นข้อผิดพลาดเป็นระยะ ๆ ในzip -ru[?!]. ไม่มีเงื่อนงำว่าจะแก้ปัญหาอย่างไร - หรือหลีกเลี่ยงในอนาคต…)
Ilya Zakharevich

@Rick: ใช่! ฉันได้เพิ่มลิงก์ไปยังการแก้ไขปัญหาใน Python (แต่ฉันไม่สามารถหาลิงก์โดยตรงไปยังโปรแกรมแก้ไขได้ในตอนนี้…)
Ilya Zakharevich

@IlyaZakharevich: D ขอบคุณ แต่ฉันก็ยอมแพ้โดยใช้ Unicode บน Windows ฉันจะใช้ Linux ในภายหลัง
Rick

387

ลอง:

chcp 65001

ซึ่งจะเปลี่ยนหน้ารหัสเป็น UTF-8 นอกจากนี้คุณต้องใช้ฟอนต์คอนโซล Lucida


18
คุณรู้หรือไม่ว่ามีวิธีทำให้เป็นค่าเริ่มต้นหรือไม่
AnnanFay

82
โปรดสังเกตว่ามีข้อผิดพลาดในการใช้งานอย่างรุนแรงในหน้ารหัสของ Windows ที่รองรับ 65001 ซึ่งจะทำลายแอปพลิเคชั่นจำนวนมากที่ต้องอาศัยวิธีการมาตรฐานไลบรารี C ของ IO ดังนั้นนี่จึงเปราะบางมาก (ไฟล์แบตช์ก็หยุดทำงานใน 65001) แต่น่าเสียดายที่ UTF-8 เป็นพลเมืองอันดับสองใน Windows
bobince

7
@bobince คุณมีตัวอย่างของบั๊กในหน้ารหัส Windows ที่รองรับ 65001 หรือไม่? ฉันอยากรู้อยากเห็นเพราะฉันไม่เคยเจอใครเลยและ googling ก็ไม่ได้ทำให้อะไรทั้งนั้น (แฟ้มรุ่นที่จะหยุดการทำงานของหลักสูตร แต่ UTF-8 คือแทบจะไม่เป็นพลเมืองชั้นสอง ... )
โรมัน Starkov

17
@romkyns: ความเข้าใจของฉันคือการโทรที่ส่งกลับจำนวนไบต์ (เช่น fread / fwrite / etc) จริง ๆ แล้วจะส่งกลับจำนวนอักขระ สิ่งนี้ทำให้เกิดอาการหลากหลายเช่นการอ่านอินพุตไม่สมบูรณ์ค้างใน fflush ไฟล์แบตช์ที่เสียหายเป็นต้น พื้นหลังบางส่วน หน้ารหัสเริ่มต้นใช้สำหรับ CJK สถานที่ "สัญลักษณ์" มีการจัดการพิเศษที่สร้างขึ้นในการแก้ไขปัญหานี้ แต่ 65001 ไม่ได้ - มันจะไม่ได้รับการสนับสนุน
bobince

7
คำถามที่น่าสนใจที่นี่ - เป็นปัญหาเพราะมันควรรายงานไบต์และรายงานตัวอักษรแทน - หรือเพราะแอปพลิเคชันที่ใช้มันได้สันนิษฐานไบต์ = ตัวอักษรไม่ถูกต้อง? กล่าวอีกนัยหนึ่งมันเป็นความล้มเหลวของ API หรือการใช้ API ล้มเหลวหรือไม่
พื้นฐาน

36

ฉันมีปัญหาเดียวกัน (ฉันมาจากสาธารณรัฐเช็ก) ฉันมีการติดตั้ง Windows ภาษาอังกฤษและต้องทำงานกับไฟล์ในไดรฟ์ที่ใช้ร่วมกัน พา ธ ไปยังไฟล์รวมถึงอักขระเฉพาะภาษาเช็ก

ทางออกสำหรับฉันคือ:

ในไฟล์แบตช์เปลี่ยนหน้าชุดอักขระ

ไฟล์ชุดของฉัน:

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

ไฟล์แบตช์ต้องได้รับการบันทึกใน CP 1250

โปรดทราบว่าคอนโซลจะไม่แสดงตัวอักษรอย่างถูกต้อง แต่จะเข้าใจพวกเขา ...


1
ไชโย! ฉันต้องการสิ่งนี้เพื่อให้ฉันสามารถป้อนอักขระลิขสิทธิ์ในแบทช์ไฟล์ของฉัน
Lea Hayes

สิ่งนี้ได้ผลอย่างสมบูรณ์แบบสำหรับฉันเช่นกันในสถานการณ์ที่เกือบเหมือนคุณ แต่เส้นทางของฉันมีตัวละครชาวไอริชเกลิคเช่นá, é, í, และó ú
Seany84

@vanna ที่แก้ไข "อักขระและช่องว่างของตุรกีในเส้นทางปัญหาเครือข่าย" ของฉัน คุณทำได้ดีมาก.
caglaror

นอกจากนี้ยังพบว่าทรัพยากรเหล่านี้: msdn.microsoft.com/en-us/library/windows/desktop/... , ss64.com/nt/chcp.html , technet.microsoft.com/en-us/library/bb490874.aspx chcp ตุรกี คือ 857
caglaror

2
คุณอาจต้องใช้แบบอักษรที่แตกต่างเพื่อแสดงอักขระอย่างถูกต้องLucida Consoleทำงานให้ฉัน
Vlastimil Ovčáčík

29

ตรวจสอบภาษาสำหรับโปรแกรมที่ไม่ใช่ Unicode หากคุณมีปัญหากับภาษารัสเซียในคอนโซล Windows คุณควรตั้งค่าภาษารัสเซียที่นี่:

การเปลี่ยนภาษาสำหรับโปรแกรมที่ไม่ใช่ Unicode


6
นั่นไม่ได้เปิดใช้งานการสนับสนุน Unicode ในcmdแต่จะสลับ codepage เริ่มต้นcp866ซึ่งยังคงเป็นชุดอักขระ 8 บิต มันใช้cp866แทนการcp1251เพิ่มปัญหาของตัวเอง
ivan_pozdeev

1
ดูฉันตอบด้านล่างสำหรับตัวเลือกใหม่ใน Windows 10 รุ่นใหม่
zvi

14

มันค่อนข้างยากที่จะเปลี่ยน Codepage เริ่มต้นของคอนโซล Windows เมื่อคุณค้นหาเว็บที่คุณพบข้อเสนอที่แตกต่างกัน แต่บางข้ออาจแตก Windows ของคุณทั้งหมดนั่นคือพีซีของคุณจะไม่สามารถบูตได้อีกต่อไป

วิธีการแก้ปัญหาที่เชื่อถือได้มากที่สุดคือคนนี้: ไปที่คีย์ Registry ของคุณHKEY_CURRENT_USER\Software\Microsoft\Command Processorและเพิ่มมูลค่า String =Autorunchcp 65001

หรือคุณสามารถใช้ Batch-Script ขนาดเล็กสำหรับหน้ารหัสทั่วไป

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

ใช้@chcp 65001>nulแทนการchcp 65001ระงับเอาท์พุท "หน้ารหัสที่ใช้งาน: 65001" คุณจะได้รับทุกครั้งที่คุณเริ่มหน้าต่างบรรทัดคำสั่งใหม่

รายการทั้งหมดของหมายเลขที่มีอยู่ทั้งหมดที่คุณสามารถรับได้จากตัวระบุรหัสหน้า

หมายเหตุการตั้งค่าจะมีผลกับผู้ใช้ปัจจุบันเท่านั้น หากคุณต้องการตั้งค่าสำหรับผู้ใช้ทุกคนให้แทนที่บรรทัดSET ROOT_KEY="HKEY_CURRENT_USER"ด้วยSET ROOT_KEY="HKEY_LOCAL_MACHINE"


เป็นตัวอย่างที่ดีและเป็นประโยชน์เช่นกัน!

13

ที่จริงแล้วเคล็ดลับก็คือพรอมต์คำสั่งจะเข้าใจอักขระที่ไม่ใช่ภาษาอังกฤษจริง ๆ เพียง แต่ไม่สามารถแสดงได้อย่างถูกต้อง

เมื่อฉันป้อนเส้นทางในพรอมต์คำสั่งที่มีตัวแยกที่ไม่ใช่ภาษาอังกฤษจะปรากฏเป็น "?? ??????????” เมื่อคุณส่งคำสั่งของคุณ (cd "?????????" ในกรณีของฉัน) ทุกอย่างทำงานตามที่คาดไว้


2
นี่อาจเป็นอันตรายเล็กน้อยเนื่องจากคุณอาจได้รับความขัดแย้งในการตั้งชื่อ เช่นหากคุณมีไฟล์สองไฟล์ทั้งสองซึ่งแสดงเป็น "???" และคุณป้อน "cd ???" มันไม่รู้ว่าจะใช้อะไร (หรือแย่กว่านั้นจะเลือกข้อใดข้อหนึ่ง)
John

26
คุณไม่ป้อน ??? คุณป้อนชื่อจริงที่เพิ่งแสดงเป็น ??? คิดว่ามันเป็นกล่องใส่รหัสผ่าน สิ่งที่คุณป้อนจะแสดงเป็น *** แต่ส่งเป็นข้อความต้นฉบับ
ผู้ใช้

นี่ใช้งานได้จริงสำหรับคำสั่งที่เรียกใช้โดยตรงในพร้อมท์คำสั่ง อย่างไรก็ตามด้วยการรัน.cmdแบตช์ไฟล์ฉันยังต้องใส่chcp 65001ที่ด้านบนของแบทช์ไฟล์
wisbucky

ในกรณีของคุณมันเป็นปัญหาแบบอักษร ... เนื้อหาอยู่ที่นั่นแค่ไม่มีแบบอักษรที่เหมาะสมที่จะแสดง แต่ OP แตกต่างกัน
WesternGun

11

บนเครื่อง Windows 10 x64 ฉันทำพร้อมท์คำสั่งแสดงอักขระที่ไม่ใช่ภาษาอังกฤษโดย:

เปิดพรอมต์คำสั่งที่ยกระดับ (เรียกใช้ CMD.EXE ในฐานะผู้ดูแลระบบ) สอบถามรีจิสตรีของคุณสำหรับแบบอักษร TrueType ที่มีอยู่ในคอนโซลโดย:

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

คุณจะเห็นผลลัพธ์เช่น:

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

ตอนนี้เราต้องเพิ่มแบบอักษร TrueType ที่รองรับอักขระที่คุณต้องการเช่น Courier New เราทำสิ่งนี้โดยการเพิ่มค่าศูนย์ให้กับชื่อสตริงดังนั้นในกรณีนี้ค่าต่อไปคือ "000"

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

ตอนนี้เราใช้การสนับสนุน UTF-8:

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

ตั้งค่าแบบอักษรเริ่มต้นเป็น "Courier ใหม่":

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

กำหนดขนาดตัวอักษรเป็น 20:

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

เปิดใช้งานการแก้ไขอย่างรวดเร็วหากคุณต้องการ:

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

3
โดยทั่วไปการใช้ codepage 65001 จะทำงานได้โดยไม่มีข้อบกพร่องใน Windows 10 ด้วยการอัปเดตผู้สร้าง ใน Windows 7 จะมีทั้งข้อบกพร่องของการส่งออกและการป้อนข้อมูล ใน Windows 8 และ Windows 10 เวอร์ชั่นที่เก่ากว่ามีเพียงบั๊กอินพุตซึ่ง จำกัด อินพุตเป็น 7 บิต ASCII
Eryk Sun

6

เมื่อฉันยังไม่เห็นคำตอบทั้งหมดสำหรับ Python 2.7 ฉันจะร่างขั้นตอนสำคัญสองขั้นตอนและขั้นตอนเพิ่มเติมที่ค่อนข้างมีประโยชน์

  1. คุณต้องมีแบบอักษรที่รองรับ Unicode Windows มาพร้อมกับ Lucida Console ซึ่งอาจเลือกได้โดยการคลิกขวาที่แถบหัวเรื่องของพรอมต์คำสั่งแล้วคลิกDefaultsตัวเลือก นอกจากนี้ยังให้การเข้าถึงสี โปรดทราบว่าคุณยังสามารถเปลี่ยนการตั้งค่าสำหรับหน้าต่างคำสั่งที่เรียกใช้ในบางวิธี (เช่นเปิดที่นี่ Visual Studio) โดยเลือกPropertiesแทน
  2. คุณต้องตั้งค่าหน้ารหัสเป็นcp65001ซึ่งดูเหมือนจะเป็นความพยายามของ Microsoft ในการให้การสนับสนุน UTF-7 และ UTF-8 ในการรับคำสั่ง ทำเช่นนี้โดยการทำงานในพร้อมรับคำสั่งchcp 65001 เมื่อตั้งค่ามันจะยังคงอยู่ในลักษณะนี้จนกว่าจะปิดหน้าต่าง คุณจะต้องทำซ้ำทุกครั้งที่คุณเปิด cmd.exe

สำหรับวิธีแก้ปัญหาที่ถาวรมากขึ้นอ้างถึงคำตอบนี้สำหรับผู้ใช้ขั้นสูง ในระยะสั้นสร้างREG_SZ(String) เข้าใช้ regedit ที่และชื่อHKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor เปลี่ยนค่าของมันไปAutoRun chcp 65001หากคุณไม่ต้องการเห็นข้อความเอาต์พุตจากคำสั่งให้ใช้@chcp 65001>nulแทน

บางโปรแกรมมีปัญหาในการโต้ตอบกับการเข้ารหัสนี้ MinGW เป็นโปรแกรมเด่นที่ล้มเหลวในขณะที่คอมไพล์ด้วยข้อความแสดงข้อผิดพลาดแบบไร้สาระ อย่างไรก็ตามมันใช้งานได้ดีมากและไม่ก่อให้เกิดข้อบกพร่องกับโปรแกรมส่วนใหญ่


5

ฉันพบว่าวิธีนี้มีประโยชน์ใน Windows 10 เวอร์ชันใหม่:

เปิดใช้คุณสมบัตินี้: "เบต้า: ใช้ Unicode UTF-8 เพื่อรองรับภาษาทั่วโลก"

แผงควบคุม -> การตั้งค่าภูมิภาค -> แท็บการดูแลระบบ -> เปลี่ยนตำแหน่งที่ตั้งของระบบ ...

การตั้งค่าภูมิภาค


วิธีการบรรลุสิ่งนี้โดยใช้ powershell หรือ cmd
Corey

ฉันพยายามแสดงตัวอักษรจีนในคอนโซลและการทำเช่นนี้ไม่สามารถใช้กับ Windows 10 64- บิต (ติดตั้งเป็นภาษาตุรกีและเปลี่ยนเป็นภาษาอังกฤษในภายหลัง) ต่อไปฉันจะลองติดตั้งภาษาจีนและดูว่าใช้งานได้หรือไม่
akinuri

4

ทางเลือกที่ง่ายอย่างหนึ่งคือการติดตั้งเชลล์ bash ของ Windows เช่นMinGWและใช้สิ่งต่อไปนี้:

ป้อนคำอธิบายภาพที่นี่

มีเส้นโค้งการเรียนรู้เล็กน้อยที่คุณจะต้องใช้ฟังก์ชันบรรทัดคำสั่ง Unix แต่คุณจะรักพลังของมันและคุณสามารถตั้งค่าชุดอักขระคอนโซลเป็น UTF-8

ป้อนคำอธิบายภาพที่นี่

แน่นอนว่าคุณยังได้รับสารพัดระวังเช่น grep, find, less ฯลฯ


ในกรณีนี้ (เก่า) ปัญหาเกิดขึ้นกับสคริปต์ไม่ใช่คอนโซล จะใช้สคริปต์ทุบตีแก้ปัญหานี้หรือไม่
Vilx-

ใช่แน่นอนว่าสคริปต์ทุบตีไม้สามารถตั้งค่าสถานะเป็น UTF-8 และเพิ่งใช้พลังงานมากกว่าไฟล์แบตช์ windows - ฉันรู้ว่ามันเป็นกรณีเก่า แต่คิดว่าตัวเลือกคุ้มค่าสำหรับการอ้างอิงในอนาคตเนื่องจาก MS ดูเหมือนจะไม่ จะดีขึ้นมากที่ Unicode
Steve Barnes

grep , ค้นหาและน้อย
Peter Mortensen

การส่งออกอักขระที่เข้ารหัส UTF-8 นั้นใช้ได้ แต่อินพุตยังคงถูกเข้ารหัสโดยเพจรหัสของระบบ
Rick

1
เพียงเพิ่มว่าผู้ใช้ Windows อาจมี bash shell อยู่แล้วหากคุณใช้ Git: เพียงเปิดหน้าต่างGit> Git Bash
skomisa

3

สำหรับปัญหาที่คล้ายกัน (ปัญหาของฉันคือการแสดงตัวอักษร UTF-8 จาก MySQL บนพรอมต์คำสั่ง)

ฉันแก้ไขมันเช่นนี้

  1. ฉันเปลี่ยนแบบอักษรของพรอมต์คำสั่งเป็น Lucida Console (ขั้นตอนนี้จะต้องไม่เกี่ยวข้องกับสถานการณ์ของคุณมันต้องทำเฉพาะกับสิ่งที่คุณเห็นบนหน้าจอและไม่เกี่ยวกับสิ่งที่เป็นตัวละครจริงๆ)

  2. ฉันเปลี่ยนเพจเพจเป็น Windows-1253 คุณทำสิ่งนี้บนพรอมต์คำสั่งโดย "chcp 1253" มันใช้งานได้กับกรณีที่ฉันต้องการเห็น UTF-8


7
Windws-1253 ไม่ใช่ codepage ของ Unicode มันเป็นเพจรหัสมาตรฐาน 256 ตัวอักษร เห็นได้ชัดว่าคุณใช้เฉพาะอักขระที่สามารถแสดงในเพจรหัสได้ แต่อักขระนั้นจะไม่เป็นสากล
Vilx-

3

ปัญหานี้ค่อนข้างน่ารำคาญ ฉันมักจะมีตัวอักษรจีนในชื่อไฟล์และเนื้อหาไฟล์ของฉัน โปรดทราบว่าฉันใช้ Windows 10 นี่คือวิธีการแก้ปัญหาของฉัน:

เพื่อแสดงชื่อไฟล์เช่นdirหรือlsถ้าคุณติดตั้ง Ubuntu bash บน Windows 10

  1. ตั้งค่าภูมิภาคเพื่อรองรับอักขระที่ไม่ใช่ utf 8

  2. หลังจากนั้นฟอนต์ของคอนโซลจะถูกเปลี่ยนเป็นฟอนต์ของโลแคลนั้นและเปลี่ยนการเข้ารหัสของคอนโซล

หลังจากคุณทำตามขั้นตอนก่อนหน้านี้แล้วเพื่อแสดงเนื้อหาไฟล์ของไฟล์ UTF-8 โดยใช้เครื่องมือบรรทัดคำสั่ง

  1. เปลี่ยนหน้าเป็น utf-8 โดย chcp 65001
  2. เปลี่ยนเป็นฟอนต์ที่รองรับ utf-8 เช่น Lucida Console
  3. ใช้typeคำสั่งเพื่อดูเนื้อหาไฟล์หรือcatถ้าคุณติดตั้ง Ubuntu bash บน Windows 10
  4. โปรดทราบว่าหลังจากตั้งค่าการเข้ารหัสของคอนโซลเป็น utf-8 แล้วฉันไม่สามารถพิมพ์ตัวอักษรจีนใน cmd โดยใช้วิธีป้อนข้อมูลภาษาจีน

ทางออกที่ขี้เกียจที่สุด: เพียงใช้คอนโซลอีมูเลเตอร์เช่นhttp://cmder.net/


นี่ไม่ได้สำหรับฉัน อักขระภาษาจีนในเอาต์พุตของpointคำสั่งยังคงอ่านไม่ออก
Ssuching Yu

@SiqingYu ฉันยอมแพ้การตั้งค่าบ้า เพียงแค่ใช้blog.miniasp.com/post/2015/09/27/Useful-tool-Cmder.aspx
code4j

ฉันใช้ Cmder มาก่อน แต่ไม่สามารถแทนที่คอนโซลนักพัฒนาซอฟต์แวร์ที่ใช้โดย Visual Studio
Ssuching Yu

@SiqingYu คุณหมายถึง c # interactive powershell หรือไม่
code4j

ไม่ใช่เชลล์พลังงานแบบโต้ตอบ แต่เป็นคอนโซลนักพัฒนาซอฟต์แวร์ที่ใช้โดย Visual C ++ ด้วย เป็นคอนโซลการดีบักเริ่มต้นในโครงการแอพลิเคชันคอนโซลของ Win32
Ssuching Yu

2

ฉันเห็นคำตอบหลายข้อที่นี่ แต่ดูเหมือนว่าไม่ได้ตอบคำถาม - ผู้ใช้ต้องการรับอินพุต Unicode จากบรรทัดคำสั่ง

Windows ใช้ UTF-16 เพื่อเข้ารหัสในสองไบต์สตริงดังนั้นคุณต้องรับสิ่งเหล่านี้จากระบบปฏิบัติการในโปรแกรมของคุณ มีสองวิธีในการทำเช่นนี้ -

1) Microsoft มีส่วนขยายที่อนุญาตให้ main ใช้อาร์เรย์อักขระแบบกว้าง: int wmain (int argc, wchar_t * argv []); https://msdn.microsoft.com/en-us/library/6wd819wh.aspx

2) เรียกใช้ windows api เพื่อรับเวอร์ชัน unicode ของบรรทัดคำสั่ง wchar_t win_argv = (wchar_t ) CommandLineToArgvW (GetCommandLineW (), & nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

อ่านนี้: http://utf8everywhere.org สำหรับข้อมูลรายละเอียดโดยเฉพาะอย่างยิ่งถ้าคุณสนับสนุนระบบปฏิบัติการอื่น ๆ


อ่าไม่ฉันขอโทษ แต่คุณพลาดคำถาม สิ่งนี้มีไว้สำหรับเมื่อฉันเขียนโปรแกรมที่จะรับอักขระ Unicode คำถามของฉันเกี่ยวกับการส่งอักขระ Unicode ไปยังโปรแกรมอื่น (ซึ่งหวังว่าจะรองรับการรับพวกเขา แต่ฉันไม่มีทางรู้ยกเว้นการถอดแยกชิ้นส่วน)
Vilx-

2

เริ่มตั้งแต่มิถุนายน 2019 ด้วย Windows 10 คุณจะไม่ต้องเปลี่ยนเพจรหัส

โปรดดูที่ " แนะนำ Windows Terminal " (จากเคย์ล่าอบเชย ) และไมโครซอฟท์ / เทอร์มิ
ด้วยการใช้ฟอนต์ Consolas จะมีการสนับสนุน Unicode บางส่วน

ดังที่ได้บันทึกไว้ในMicrosoft/Terminalปัญหา 387 :

ปัจจุบันมีอุดมคติอักษร Unicode 87,887 รายการ คุณต้องการทั้งหมดของพวกเขาด้วยหรือไม่
เราจำเป็นต้องมีขอบเขตและตัวอักษรที่เกินขอบเขตนั้นควรได้รับการจัดการโดยฟอนต์ fallback / การเชื่อมโยงฟอนต์ / อะไรก็ตาม

สิ่งที่ Consolas ควรครอบคลุม:

  • อักขระที่ใช้เป็นสัญลักษณ์ที่ใช้โดยโปรแกรม OSS ที่ทันสมัยใน CLI
  • อักขระเหล่านี้ควรเป็นไปตามการออกแบบและตัวชี้วัดของ Consolas และสอดคล้องกับอักขระ Consolas ที่มีอยู่อย่างเหมาะสม

สิ่งที่ Consolas ไม่ควรครอบคลุม:

  • อักขระและเครื่องหมายวรรคตอนของสคริปต์ที่นอกเหนือจากละตินกรีกและซีริลลิกโดยเฉพาะอย่างยิ่งอักขระต้องมีการจัดรูปทรงที่ซับซ้อน (เช่นอาหรับ)
  • อักขระเหล่านี้ควรได้รับการจัดการโดยใช้แบบอักษรสำรอง

1

การตัดสินใจที่รวดเร็วสำหรับไฟล์. bat หากคอมพิวเตอร์ของคุณแสดงพา ธ / ชื่อไฟล์ของคุณถูกต้องเมื่อคุณพิมพ์ใน DOS-window:

  1. copy con temp.txt [กด Enter]
  2. พิมพ์ชื่อพา ธ / ไฟล์ [กด Enter]
  3. กดCtrl-Z [กด Enter]

วิธีนี้คุณสร้างไฟล์. txt - temp.txt เปิดใน Notepad คัดลอกข้อความ (ไม่ต้องกังวลว่ามันจะดูไม่สามารถอ่านได้) และวางไว้ในไฟล์. bat ของคุณ การดำเนินการ. bat สร้างขึ้นด้วยวิธีนี้ใน DOS-window สามารถทำงานได้กับฉัน (Cyrillic, Bulgaria)


1

สิ่งที่ต้องทำความสะอาดดีกว่า: เพียงติดตั้งชุดภาษาญี่ปุ่นของ Microsoft ที่ให้บริการฟรี (แพ็คภาษาตะวันออกอื่น ๆ ยังใช้งานได้ แต่ฉันได้ทดสอบภาษาญี่ปุ่นแล้ว)

สิ่งนี้จะให้แบบอักษรด้วย glyphs ขนาดใหญ่ขึ้นทำให้เป็นพฤติกรรมเริ่มต้นเปลี่ยนเครื่องมือ Windows ต่างๆเช่น cmd, WordPad เป็นต้น


1

การเปลี่ยนโค้ดเพจเป็น 1252 นั้นใช้ได้สำหรับฉัน ปัญหาสำหรับฉันคือสัญลักษณ์ Doller คู่ที่กำลังแปลงเป็นสัญลักษณ์อื่นโดย DOS บน Windows Server 2008

ฉันเคยใช้ CHCP 1252 และ cap มาก่อนในคำสั่ง BCP ของฉัน ^ §


ขอบคุณมันใช้งานได้! ฉันไม่รู้ว่าทำไมคนลงคะแนนนี้มันเป็นทางเลือกที่ถูกต้องสำหรับบางคน .. เพจรหัส 1252 นี้แก้ไขปัญหาได้ใน Windows Server 2012 ด้วยซึ่งรหัสเดียวกันกับ CP 65001 ไม่ทำงานสำหรับฉัน ฉันคิดว่ามันขึ้นอยู่กับสิ่งที่เพจสคริปต์แบทช์ถูกแก้ไขด้วยหรือค่าเริ่มต้นของระบบปฏิบัติการ ในกรณีนี้มันถูกสร้างขึ้นด้วย Notepad บนเครื่อง MUI เยอรมันพร้อมระบบปฏิบัติการ en-US พื้นฐาน ..
Tony Wall

0

ฉันได้รับปัญหาที่คล้ายกันในการลบไฟล์ที่มีชื่อ Unicode โดยอ้างถึงพวกเขาในไฟล์แบตช์ด้วยชื่อสั้น ๆ (8 จุด 3)

ชื่อสั้น ๆ dir /xสามารถดูได้โดยการทำ เห็นได้ชัดว่าใช้งานได้กับชื่อไฟล์ Unicode ที่รู้จักกันแล้วเท่านั้น

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