การเข้ารหัสอักขระรองรับมากขึ้น cat และน้อยกว่า


18

ฉันมีไฟล์ข้อความที่เข้ารหัสดังต่อไปนี้ตามfile:

ข้อความ ISO-8859 ที่มีตัวต่อบรรทัด CRLF

ไฟล์นี้มีข้อความภาษาฝรั่งเศสด้วยสำเนียง เปลือกของฉันสามารถแสดงการเน้นเสียงและemacsในโหมดคอนโซลสามารถแสดงการเน้นเสียงเหล่านี้ได้อย่างถูกต้อง

ปัญหาของฉันที่more, catและlessเครื่องมือที่จะไม่แสดงไฟล์นี้ได้อย่างถูกต้อง ฉันเดาว่าหมายความว่าเครื่องมือเหล่านี้ไม่สนับสนุนชุดการเข้ารหัสอักขระนี้ มันเป็นเรื่องจริงเหรอ? เครื่องมือเหล่านี้รองรับการเข้ารหัสอักขระได้อย่างไร

คำตอบ:


17

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

echo $LANG

คุณมีสองตัวเลือกคุณสามารถเปลี่ยนการเข้ารหัสเริ่มต้นหรือเปลี่ยนไฟล์เป็น UTF-8 หากต้องการเปลี่ยนการเข้ารหัสของคุณให้เปิดเทอร์มินัลแล้วพิมพ์

export LANG="fr_FR.ISO-8859"

ตัวอย่างเช่น:

$ echo $LANG 
en_US.UTF-8
$ cat foo.txt 
J'ai mal � la t�te, c'est chiant!
$ export LANG="fr_FR.ISO-8859"
$ xterm <-- open a new terminal 
$ cat foo.txt 
J'ai mal à la tête, c'est chiant!

หากคุณกำลังใช้งานgnome-terminalหรือคล้ายกันคุณอาจต้องเปิดใช้งานการเข้ารหัสเช่นterminatorคลิกขวาและ:

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

สำหรับgnome-terminal:

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

ตัวเลือกอื่น ๆ (ดีกว่า) ของคุณคือเปลี่ยนการเข้ารหัสของไฟล์:

$ cat foo.txt 
J'ai mal � la t�te, c'est chiant!
$ iconv -f ISO-8859-1 -t UTF-8  foo.txt > bar.txt
$ cat bar.txt 
J'ai mal à la tête, c'est chiant!

4

การเข้ารหัสอักขระ ISO-8858 นั้นล้าสมัยไปแล้วสำหรับระบบ Linux ระบบลีนุกซ์ทั้งระบบของคุณนั้นใช้ UTF-8 มาตลอด รวมถึงเทอร์มินัลอีมูเลเตอร์และเปลือกของคุณ

อย่างไรก็ตาม cat, grepและlessไม่ได้ทำการเปลี่ยนแปลงการเข้ารหัสใด ๆ พวกเขาจะปฏิบัติต่อ ISO-8859 / ไฟล์ latin1 ของคุณเป็น UTF-8 ซึ่งจะไม่ทำงาน

หาก emacs สามารถแสดงได้อาจเป็นเพราะมันพยายามตรวจจับการเข้ารหัสที่ใช้และดูเหมือนจะประสบความสำเร็จโดยอัตโนมัติ บอก emacs ให้บันทึกไฟล์เป็น UTF-8 และคุณจะสามารถใช้cat/ grep/ อะไรก็ตามที่อยู่ในนั้น

หากคุณรู้ว่าการเข้ารหัสอักขระที่แน่นอน (ISO-8859 เป็นชุดของพวกเขาคุณต้องรู้แน่นอน: ISO-8859-1 หรือ ISO-8859-15 หรือแย่กว่านั้น) คุณสามารถแปลงไฟล์ของคุณจากบรรทัดคำสั่ง :

iconv --from-code ISO-8859-15 your_file -o your_file_as_utf8

2

Cat, More and Less กำลังทำหน้าที่แสดงไฟล์ การแปลระหว่างการเข้ารหัสไม่ได้อยู่ในรายละเอียดงานของพวกเขา การเข้ารหัสของบรรทัดใหม่ไม่ใช่ปัญหาเนื่องจาก CRLF แสดงเช่นเดียวกับบรรทัดปกติที่ลงท้ายด้วย LF แต่เทอร์มินัลของคุณอาจคาดหวังข้อความ UTF-8 ที่เข้ารหัสซึ่งเป็นมาตรฐานในปัจจุบัน

Luitแปลระหว่างการเข้ารหัสที่รองรับและ UTF-8 คุณบอก Luit ว่าการเข้ารหัสเพื่อแปลโดยการตั้งค่าLC_CTYPEตัวแปรสภาพแวดล้อมหรือด้วย-encodingตัวเลือก ตัวอย่างเช่นหากต้องการแสดงไฟล์ latin-1 (aka ISO 8859-1):

LC_CTYPE=en_US luit less somefile
luit -encoding ISO8859-1 less somefile

หากไฟล์อยู่ในการเข้ารหัสที่แปลกใหม่ที่ Luit ไม่สนับสนุนคุณสามารถไปป์ผ่านโปรแกรมแปล Iconvรองรับการเข้ารหัสจำนวนมาก

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