ปัญหาการเข้ารหัสเอาต์พุตบันทึก git ในพรอมต์คำสั่งของ Windows 10


89

ปัญหา

วิธีทำให้git logเอาต์พุตคำสั่งแสดงอย่างถูกต้องบนพรอมต์คำสั่งของ Windows

ตัวอย่าง

ลำดับคำสั่ง git ที่นำไปสู่ปัญหา อย่างที่คุณเห็นฉันสามารถพิมพ์อักขระกำกับเสียงได้อย่างถูกต้อง แต่บนgit logเอาต์พุตจะมีการหลีกเลี่ยง ตามUTF-8ตารางการเข้ารหัสรหัสระหว่างวงเล็บเหลี่ยม ( <และ>) จากเอาต์พุตจะสอดคล้องกับgit configพารามิเตอร์ที่พิมพ์ไว้ก่อนหน้านี้

ฉันได้พยายามตั้งค่าLESSCHARSETตัวแปรสภาพแวดล้อมutf-8เป็นคำตอบสำหรับปัญหาที่คล้ายกันแต่ผลลัพธ์ก็อ่านไม่ออก:

git log output หลังจากตั้งค่า LESSCHARSET = utf8

ฉันรู้ว่า.git/configเข้ารหัสอย่างถูกต้องutf-8ตามที่ได้รับการจัดการตามgitkที่คาดไว้

เอาต์พุต gitk ที่เหมาะสม

นี่คือlocaleเอาต์พุตคำสั่งหากจำเป็น

LANG=
LC_CTYPE="C.UTF-8"
LC_NUMERIC="C.UTF-8"
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY="C.UTF-8"
LC_MESSAGES="C.UTF-8"
LC_ALL=

แก้ไข:

ผลลัพธ์จะเหมือนกันในgit-bash :

ใส่คำอธิบายภาพที่นี่

ดังนั้นฉันเชื่อว่าปัญหานั้นไม่ขึ้นกับเชลล์และเกี่ยวข้องกับ Git หรือการกำหนดค่าเอง


2
คุณได้ลองใช้วิธีแก้ปัญหาใน " อักขระ Unicode ในบรรทัดคำสั่งของ Windows - อย่างไร "?
jthill

ใช่ฉันลองใช้โค้ดหลายหน้ารวมถึง 65001 (UTF-8) โดยไม่มีผลลัพธ์ใด ๆ ดูเหมือนว่าคำสั่ง chcp จะไม่มีผลต่อวิธีการแสดงผลลัพธ์ของบันทึก git จะแสดงในลักษณะเดียวกันเสมอ
Marcin Kłopotek

1
ขออภัยหากคำถามฟังดูโง่ แต่ทำไมคุณถึงใช้พรอมต์คำสั่งของ Windows แทน Git Bash เหมาะกับการใช้ Git มากขึ้นหน้าต่างสามารถปรับขนาดได้เป็นแบบเต็มหน้าจอพร้อมท์จะแสดงให้คุณทราบโดยอัตโนมัติว่าคุณอยู่สาขาใดเป็นต้น
kriegaex

ไม่ได้โง่ @kriegaex มันดีจริง ฉันใช้ git-bash ที่ห่อหุ้มไว้ใน ConEmu เพื่อใช้ในชีวิตประจำวัน ผลที่ได้คือเดียวกันi.imgur.com/hMKz9D3r.png ฉันได้อธิบายปัญหาของฉันโดยยกตัวอย่าง cmd.exe เพื่อไม่ให้ผู้คนสับสนกับเครื่องมือที่ต้องพึ่งพาอื่น ๆ ที่กำลังใช้อยู่เนื่องจากฉันเชื่อว่าปัญหานั้นไม่ขึ้นกับเชลล์และเกี่ยวข้องกับ Git หรือการกำหนดค่าเอง
Marcin Kłopotek

คำตอบ:


159

เอาล่ะฉันได้ทดลองเล็กน้อยและพบว่าคำสั่ง Windows Git ต้องการตัวแปร UNIX จริง ๆ เช่นLC_ALLเพื่อให้แสดงภาษาโปแลนด์ (หรืออักขระ UTF-8 อื่น ๆ ) ได้อย่างถูกต้อง ลองใช้คำสั่งนี้:

set LC_ALL=C.UTF-8

จากนั้นสนุกกับผลลัพธ์ นี่คือสิ่งที่เกิดขึ้นบนคอนโซลของฉัน (แบบอักษร "Consolas" ไม่chcpจำเป็น):

CMD คอนโซล Windows


อัปเดต:

  • ดีในการสั่งซื้อสำหรับคำสั่งเช่น Windows type(แฟ้มแสดงบนคอนโซล) chcp 65001ในการทำงานอย่างถูกต้องคุณจะต้อง
  • และถ้าคุณต้องการคำสั่งจาก Git Bash เช่นเดียวกับที่catคุณได้กำไรจากสิ่งที่กล่าวset LC_ALL=C.UTF-8มา

CMD คอนโซล Windows ตอนที่ 2


อัปเดต 2: วิธีทำการเปลี่ยนแปลงอย่างถาวร

ดังที่ผู้ใช้โมโนเบลนกล่าวว่าให้สร้างตัวแปรสภาพแวดล้อมLC_ALLและกำหนดค่าC.UTF-8ไม่ว่าจะเป็นแบบทั่วโลกหรือสำหรับโปรไฟล์ผู้ใช้ของคุณเองเท่านั้น (ขออภัยสำหรับภาพหน้าจอภาษาเยอรมัน):

สร้างตัวแปรสภาพแวดล้อม

ครั้งต่อไปที่คุณเปิดคอนโซลประมวลผลคำสั่ง (cmd.exe) echo %LC_ALL%คุณจะเห็นค่าของตัวแปรเมื่อการออกคำสั่ง ใน PowerShell $env:LC_ALLคุณจะเห็นมันเมื่อออก

วิธีที่ง่ายที่สุดในการทำให้โค้ดเพจ UTF-8 เป็นแบบถาวรคือการเปิดregeeditและเพิ่มค่าใหม่ที่ชื่อAutorunของสตริงประเภทให้กับส่วน HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processorและกำหนดค่าchcp 65001นั้น

ตัวแก้ไขการลงทะเบียน

ดังนั้นคำสั่งนี้จะดำเนินการทุกครั้งที่คุณเปิดคอนโซล cmd.exe ใหม่ คุณยังเห็นผลลัพธ์ในหน้าต่างใหม่: "Aktive Codepage: 65001" (หรือคล้ายกันในภาษาของคุณ)

อ้ออีกอย่าง: ในการแสดงไฟล์ที่เข้ารหัส UTF-8 อย่างถูกต้องใน PowerShell คุณสามารถใช้Get-Content -encoding UTF8 file.txtหรือcat -encoding UTF8 file.txt( catเป็นนามแฝงสำหรับGet-Contentใน PowerShell)


LC_ALLคอมไพล์เองไม่จำเป็นต้องตั้งค่า เครื่องมืออื่น ๆ - มาพร้อมกับ git installaion - like lessซึ่งเป็นเพจเจอร์เริ่มต้น / ดูcore.pagerใช้LC_ALLค่านี้ ค่าอื่น ๆ ที่ถูกต้องคือภาษาภาษาท้องถิ่นเช่น: LC_ALL=de_DE.UTF-8สำหรับชาวเยอรมัน
กลับ 42

1
คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมจาก commandline โดยใช้setx LC_ALL C.UTF-8
anion

Powershell 6 ใน ConEmu ก็เพียงพอแล้วที่จะเพิ่ม$env.LC_ALL='ClUTF-8'ไปยัง$Profile
Andrew Spencer

67

หากใครสนใจ PowerShell เทียบเท่าset LC_ALL=C.UTF-8นั่นคือ:

$env:LC_ALL='C.UTF-8'

อย่างไรก็ตามสิ่งนี้ใช้ได้กับเซสชันปัจจุบันเท่านั้น เพื่อให้เป็นไปอย่างถาวรมีความเป็นไปได้สองประการ:

  • สร้างตัวแปรสภาพแวดล้อมที่ตั้งชื่อLC_ALLด้วยค่าC.UTF-8
  • หรือใส่ไฟล์$env:LC_ALL='C.UTF-8'ของคุณ$Profile

1
หรือเพิ่มลงในโปรไฟล์ PowerShell ของคุณ (ฉันชอบสิ่งนี้กับการตั้งค่าส่วนกลางเพราะฉันใช้โปรไฟล์เดียวกัน - ผ่าน git - บนหลายเครื่อง)
Richard

3
ไฟล์โปรไฟล์สามารถแก้ไขได้โดยตัวอย่างเช่น run: notepad $ profile จากนั้นเพิ่มบรรทัดที่ใดก็ได้ตามที่ mono blaine แนะนำ $ env: LC_ALL = 'C.UTF-8'
Tore Aurstad

ด้วย PowerShell 6 + ConEmu บน Windows 10: ใช้งานได้ไม่จำเป็นต้องมีอะไรอีก
Andrew Spencer

6

ฉันใช้Gitผ่านV7.0.3 Powershell หลักกับหรู-คอมไพล์ติดตั้งอยู่ภายในWindows Terminalบน Windows 10

ฉันค้นดูคำตอบและลองหลายคำตอบ วิธีแก้ปัญหาที่เหมาะกับฉันคือ:

โซลูชันเหล่านี้ทำงานแยกกัน ฉันเลือกใช้คำสั่ง Git เนื่องจากปัญหาน่าจะเกี่ยวข้องกับ Git และโปรไฟล์ Powershell ยังคงสะอาดอยู่


ขอบคุณสำหรับการตั้งค่า Git การตั้งค่า Git ใช้งานได้สำหรับฉัน แต่ยังพบว่าการตั้งค่า$env:LESSCHARSET='utf-8'ทำงานได้ดีสำหรับ PowerShell 5 ใน Windows Terminal
mloskot

5

ฉันใช้git bashกับWIN10. สำหรับฉันการตั้งค่า 4 อย่างทำให้เป็นไปตามที่ฉันคาดหวัง

  • envการตั้งค่า. เพิ่มLC_ALL=C.UTF-8, LESSCHARSET=UTF-8ไปPATHทั่วโลก

  • gitconfig. git config --global i18n.logOutputEncoding utf-8.

  • git bashการตั้งค่า. ตั้งค่าOptions-> Text-> Character setเป็นutf-8. หรือการตั้งค่าlocaleและทั้งสองCharacter set มันก็เพียงพอที่จะเลือกสมาร์ทที่ถูกต้องdefaultencoding

เสร็จแล้ว


ฉันใช้gitในพรอมต์คำสั่งของ Windows และสองขั้นตอนแรกสามารถแก้ไขปัญหาสำหรับกรณีของฉันได้
nglee


0

ฉันมีปัญหาดังกล่าวบน Linux และปัญหาคือฉันไม่ได้สร้างโลแคล ดังนั้นผลลัพธ์ของฉันlocaleคือไม่สามารถใช้ตัวอักษร "C" ทั้งหมดได้โดยไม่ต้องใช้ UTF-8 เพื่อแก้ปัญหานี้ฉันไม่ใส่ความคิดเห็นen_US.UTF-8และru_RU.UTF-8ใน /etc/locale.gen จากนั้นฉันเรียกใช้ localectl set-locale LANG = ru_RU.UTF-8 และรีบูต และเข้าสู่ระบบ หลังจากนั้น Ciryllic ก็แสดงเป็นปกติ

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