ฉันจะตั้งค่าการเข้ารหัสเริ่มต้นของ VIM เป็น UTF-8 ได้อย่างไร


62

ฉันต้องการมีส่วนร่วมในโครงการโอเพนซอร์สที่ให้บริการสตริงที่แปล หนึ่งในความต้องการของพวกเขาคือผู้ร่วมให้ข้อมูลต้องใช้ UTF-8 เพื่อเข้ารหัสไฟล์ PO

ฉันใช้ VIM 7.3 บน Linux ฉันจะแน่ใจได้อย่างไรว่าการเข้ารหัสของ VIM ถูกตั้งค่าเป็น UTF-8 ดังนั้นฉันจึงสามารถแก้ไขและบันทึกไฟล์. po ได้อย่างถูกต้อง

คำตอบ:


64

เมื่อ 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


3
จริงๆแล้วมันดูเหมือนว่าผมไม่ได้มีการแก้ไขรำคาญ.vimrc; ในความเป็นจริงค่าเริ่มต้นของการเข้ารหัสคือ "latin1" หรือค่าจาก $ lang en_US.UTF-8ซึ่งในระบบของฉันมีการตั้งค่า ด้วยเหตุนี้จึง:set encodingให้encoding=utf-8ออกจากกล่อง เป็นที่คาดหวังถ้า LANG ไม่มีการตั้งค่าให้:set encoding encoding=latin1ขอบคุณสำหรับคำตอบที่ยอดเยี่ยม!
เปาโล

นั่นอาจเป็นประโยชน์โดยทั่วไปดังนั้นฉันจึงได้เพิ่มเข้าไปในคำตอบ
MetaEd

หากคุณเปิดไฟล์ที่เข้ารหัสเป็น latin1 การตั้งค่านี้จะไม่เปลี่ยนการเข้ารหัสไฟล์หรือไม่ คุณจะได้รับ Vim เพื่อให้การเข้ารหัสไฟล์ยังคงเหมือนเดิม แต่ต้องการ utf-8 สำหรับไฟล์ใหม่ได้อย่างไร
David Kennedy

@DaveKennedy Vim สามารถจัดการไฟล์เป็น Latin-1 เฉพาะเมื่อไฟล์นั้นเป็น Latin-1 อย่างไม่น่าสงสัย เมื่อการเข้ารหัสไม่ชัดเจน Vim จะต้องเลือก ตัวอย่างเช่นไฟล์ที่มีรหัส ASCII 7 บิตเท่านั้นคือ Latin1 ที่ถูกต้อง แต่ก็เป็น UTF-8 ที่ถูกต้องและอื่น ๆ โดยปกติไฟล์ดังกล่าวจะถือว่าเป็น UTF-8 วิธีหนึ่งในการหลีกเลี่ยงผลลัพธ์นี้คือการทำให้การเข้ารหัสไฟล์ไม่ชัดเจน เคล็ดลับที่ฉันเห็นคือการเพิ่มสตริงของรหัส 0xF7 ใน UTF-8 0xF7 นั้นไม่ถูกต้อง แต่ในภาษาละติน -1 มันหมายถึงเครื่องหมายหาร (÷) โดยทั่วไปจะสรุปว่าไฟล์ดังกล่าวเป็น Latin-1
MetaEd

4

ตามvimdoc vim พยายามที่จะตรวจจับการเข้ารหัสไฟล์โดยอัตโนมัติดังนั้นหากคุณกำลังแก้ไขไฟล์ที่มีอยู่คุณก็แสดงว่าดี

:set fileencodings=utf-8คุณสามารถบังคับเข้ารหัสถ้าคุณต้องการด้วย คุณสามารถค้นหาเอกสารที่นี่


6
fileencodings = utf-8 จะทำให้ Vim รับรู้อินพุตไฟล์เป็น UTF-8 แต่จากนั้นทำการแปลง lossy เป็น Latin-1 และจะทำให้ Vim ไม่สามารถจดจำ UTF-16 ได้ ทางออกที่ดีกว่าคือการตั้งค่าการเข้ารหัส = utf-8 ซึ่งเปลี่ยน Vim จาก native one-byte editor เป็น native multibyte editor
MetaEd

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