เมื่อ Vim อ่านไฟล์ที่มีอยู่มันจะพยายามตรวจจับการเข้ารหัสไฟล์ เมื่อเขียนไฟล์ออกมา Vim ใช้การเข้ารหัสไฟล์ที่ตรวจพบ (ยกเว้นเมื่อคุณบอกว่าแตกต่างกัน) ดังนั้นไฟล์ที่ตรวจพบว่าเป็น UTF-8 จะถูกเขียนเป็น UTF-8 ไฟล์ที่ตรวจพบในภาษาละติน -1 จะถูกเขียนเป็นภาษาละติน -1 และต่อไปเรื่อย ๆ
โดยค่าเริ่มต้นกระบวนการตรวจจับเป็นน้ำมันดิบ ทุกไฟล์ที่คุณเปิดด้วย Vim จะถือว่าเป็น Latin-1 เว้นแต่ว่ามันจะตรวจจับเครื่องหมายลำดับไบต์ Unicode ที่ด้านบน ไฟล์ UTF-8 ที่ไม่มีเครื่องหมายไบต์จะยากต่อการแก้ไขเพราะอักขระหลายไบต์จะแสดงในบัฟเฟอร์เป็นลำดับอักขระแทนอักขระเดี่ยว
โดยค่าเริ่มต้นแย่กว่าเป็นกลุ่มใช้ละติน -1 เพื่อแสดงข้อความในบัฟเฟอร์ ดังนั้นไฟล์ UTF-8 ที่มีเครื่องหมายคำสั่งไบต์จะเสียหายโดยการแปลงลงเป็น Latin-1
ทางออกคือการกำหนดค่า Vim ให้ใช้ UTF-8 ภายใน ในความเป็นจริงนี่คือคำแนะนำในเอกสาร Vim และเหตุผลเดียวที่ไม่ได้กำหนดค่าไว้เพื่อหลีกเลี่ยงการสร้างความสับสนอย่างมากในหมู่ผู้ใช้ที่คาดว่า Vim จะทำงานเป็นบรรณาธิการ Latin-1
ในของคุณ.vimrc
เพิ่มset encoding=utf-8
และรีสตาร์ทเป็นกลุ่ม
หรือแทนให้ตั้งค่าLANG
ตัวแปรสภาพแวดล้อมเพื่อระบุว่า UTF-8 เป็นการเข้ารหัสอักขระที่คุณต้องการ สิ่งนี้จะส่งผลกระทบไม่เพียง แต่เป็นกลุ่ม แต่ซอฟต์แวร์ใด ๆ ที่ใช้LANG
เพื่อกำหนดว่าควรแสดงข้อความอย่างไร ตัวอย่างเช่นในการบ่งบอกถึงข้อความที่ควรจะปรากฏในภาษาอังกฤษ ( en
) เช่นพูดในสหรัฐอเมริกา ( US
) เข้ารหัสเป็น UTF-8 ( utf-8
) LANG=en_US.utf-8
ตั้ง
ตอนนี้กลุ่มจะใช้ UTF-8 เพื่อแสดงข้อความในบัฟเฟอร์ ยิ่งไปกว่านั้นมันจะพยายามอย่างเต็มที่ในการตรวจจับการเข้ารหัส UTF-8 ในไฟล์ นอกจากมองหาเครื่องหมายคำสั่งแบบไบท์แล้วมันจะตรวจสอบ UTF-8 โดยไม่มีเครื่องหมายคำสั่งแบบไบท์ก่อนจะถอยกลับไปเป็นภาษาละติน -1 ดังนั้นมันจะไม่ทำให้เกิดความเสียหายกับไฟล์ที่เข้ารหัสใน UTF-8 อีกต่อไปและมันควรจะแสดงตัวอักษร UTF-8 อย่างเหมาะสมในระหว่างการแก้ไข
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการที่เป็นกลุ่มตรวจพบการเข้ารหัสไฟล์ดูตัวเลือกในเอกสารที่เป็นกลุ่มfileencodings
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าการเข้ารหัสที่เป็นกลุ่มใช้ภายในดูตัวเลือก
encoding
หากคุณต้องการที่จะแทนที่การเข้ารหัสที่ใช้เมื่อเขียนไฟล์กลับไปยังดิสก์ดูตัวเลือก
fileencoding
.vimrc
; ในความเป็นจริงค่าเริ่มต้นของการเข้ารหัสคือ "latin1" หรือค่าจาก $ langen_US.UTF-8
ซึ่งในระบบของฉันมีการตั้งค่า ด้วยเหตุนี้จึง:set encoding
ให้encoding=utf-8
ออกจากกล่อง เป็นที่คาดหวังถ้า LANG ไม่มีการตั้งค่าให้:set encoding
encoding=latin1
ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม!