ฉันจะค้นหาการเข้ารหัสของบัฟเฟอร์ปัจจุบันเป็นกลุ่มได้อย่างไร


89

สมมติว่าฉันกำลังแก้ไขไฟล์ด้วย vim (หรือ gvim) ฉันไม่มีความคิดเกี่ยวกับการเข้ารหัสไฟล์และฉันต้องการทราบว่าเป็น UTF-8 หรือ ISO-8859-1 หรือไม่ ฉันสามารถบอกให้ vim แสดงการเข้ารหัสที่ใช้หรือไม่

คำตอบ:


103

การตั้งค่าการเข้ารหัสไฟล์แสดงการเข้ารหัสบัฟเฟอร์ปัจจุบัน:

:set fileencoding
fileencoding=utf8

ไม่มีวิธีทั่วไปในการพิจารณาการเข้ารหัสของไฟล์ plaintext เนื่องจากข้อมูลนั้นไม่ได้รับการบันทึกไว้ในไฟล์นั้นยกเว้นไฟล์ UTF-8 ซึ่งคุณได้รับ BOM ที่เรียกว่าการเข้ารหัส นี่คือเหตุผลที่ไฟล์ xml และ html มีเมตาแท็ก charset

คุณสามารถบังคับใช้การเข้ารหัสเฉพาะด้วยการตั้งค่า 'การเข้ารหัส' ดู:help encodingและเป็น:help fileencodingกลุ่มสำหรับวิธีที่เครื่องมือแก้ไขจัดการการตั้งค่าเหล่านี้ คุณยังสามารถเพิ่มการตั้งค่าการเข้ารหัสไฟล์จำนวนมากให้กับ vimrc ของคุณเพื่อให้ vim ลองตรวจจับตามค่าที่ระบุไว้


1
สมบูรณ์ แม้ว่าจะค่อนข้างเคาน์เตอร์ใช้งานง่าย ขอขอบคุณ!
innaM

7
โชคไม่ดีไม่ถูกต้อง สำหรับ Vim ไม่พบการเข้ารหัสของไฟล์ที่คุณกำลังอ่าน มันไม่ได้เขียนในไฟล์ มันสามารถเดาได้จากตัวละครที่มีอยู่ในไฟล์เท่านั้น ตัวอย่างเช่นไฟล์ที่มีข้อความ "abcdef" สามารถอยู่ในการเข้ารหัสได้หลายอันเนื่องจากจริง ๆ แล้วรองรับอักขระเหล่านั้นทั้งหมด แต่ไฟล์ที่มี "šđčćž" น่าจะอยู่ใน CP1252 ดังนั้นคุณไม่ได้อ่านการเข้ารหัสจากที่อื่น แต่คาดเดาการเข้ารหัสที่อาจเป็นและขึ้นอยู่กับการแสดงที่ถูกต้อง
โกง

6
สิ่งที่คุณกำลังทำที่นี่คือการตั้งค่าการเข้ารหัสอย่างชัดเจนตามการสังเกตของเนื้อหาของไฟล์ หากคุณต้องการให้ vim ลองเข้ารหัสหลายครั้งเมื่อเปิดไฟล์ให้ใส่หลาย ๆ ไฟล์ไว้ในตัวเลือกใน _vimrc ของคุณ
โกง

@ ligas ขอบคุณสำหรับคำติชมฉันได้อัปเดตคำตอบให้ชัดเจนยิ่งขึ้นในเรื่องนั้น (ฉันหวังว่า!)
jtimberman

2
น่าจะเป็นมูลค่าการกล่าวขวัญว่า BOMs คือ 1. ) ไม่ซ้ำกับ UTF-8 - แม้ว่า UTF-8 คือแตกต่างจาก BOMs อื่น ๆ 2. ) ไม่จำเป็นและมักจะไม่พบใน UTF-8
ruffin

13

โปรดทราบว่าการเข้ารหัสไฟล์ไม่ได้ระบุไว้อย่างชัดเจนในไฟล์ ดังนั้น VIM และแอปพลิเคชั่นอื่น ๆ จะต้องเดาการเข้ารหัส วิธีการที่เป็นที่ยอมรับในการทำสิ่งนี้คือchardetแอ็พพลิเคชันซึ่งสามารถเรียกใช้จากภายใน VIM ดังนี้:

:!chardet %

คำตอบที่จัดทำโดย jtimberman จะแสดงการเข้ารหัสบัฟเฟอร์ปัจจุบันซึ่งอาจไม่เหมือนกับการเข้ารหัสไฟล์ในดิสก์ ดังนั้นคุณจะสังเกตเห็นว่าchardetบางครั้งจะแสดงการเข้ารหัสที่แตกต่างจาก VIM โดยเฉพาะถ้าคุณมีการกำหนดค่า VIM ให้ใช้การเข้ารหัสเฉพาะเสมอ (เช่น UTF-8)

สิ่งที่ดีเกี่ยวกับchardetคือให้คะแนนความเชื่อมั่นในการคาดเดาในขณะที่ VIM สามารถ (และบ่อยครั้ง) ผิดเกี่ยวกับการเดาการเข้ารหัสหากมีอักขระไม่เกิน \ x7F (ASCII 127) ตัวอย่างเช่นการเพิ่มאไฟล์ PHP รหัสเดียวลงในไฟล์ขนาดยาวทำให้chardetคิดว่าไฟล์นั้นISO-8859-2มีความมั่นใจ 0.72 ในขณะที่การเพิ่มวลีที่ยาวกว่าเล็กน้อยשלום, עולם!‏ให้ UTF-8 ด้วยคะแนนความมั่นใจ 0.99 ในทั้งสองกรณีset fileencoding?แสดงUTF-8ไม่ได้เพราะไฟล์บนดิสก์คือ UTF-8 แต่เนื่องจาก VIM ถูกกำหนดค่าให้ใช้ UTF-8 ภายใน


ฉันขอแนะนำให้คุณพูดถึงคำเกี่ยวกับความพร้อมใช้งานของ chardet ใน OS'es
Soundararajan

@Soundararajan: ฉันไม่ใช่คนที่พูดถึงว่าฉันใช้ Debian และ CentOS เท่านั้น คุณได้รับเชิญให้แก้ไขคำตอบหากคุณมีข้อมูลที่เกี่ยวข้อง ขอบคุณ!
dotancohen

ฉันไม่เห็นความจำเป็นที่จะต้องทำสิ่งนั้นภายใน VIM ดีกว่าที่จะทำจากภายนอก: chardet <file>. ยังข้อเสนอแนะที่ดี
lepe

-1

ฉันพบว่า: https://vim.fandom.com/welo/Reloading_a_file_using_a_different_encoding

คุณสามารถโหลดไฟล์ใหม่โดยใช้การเข้ารหัสที่แตกต่างกันหาก Vim ไม่สามารถตรวจจับการเข้ารหัสที่ถูกต้อง:

:e ++enc=<encoding>

encodingจะอยู่ที่ไหนcp850, ISO-8859-1, UTF-8, ...

คุณสามารถใช้file yourfilenameเพื่อค้นหาการเข้ารหัสหรือchardetect(จัดทำโดยpython-chardetหรือuchardetขึ้นอยู่กับการกระจาย Linux ของคุณ) ตามที่ dotancohen แนะนำ


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