วิธีรับการเข้ารหัสอักขระของเทอร์มินัล


116

ตอนนี้ฉันเปลี่ยนการเข้ารหัสอักขระของ gnome-terminal เป็น "GBK" (ค่าเริ่มต้นคือ UTF-8) แต่ฉันจะรับค่า (การเข้ารหัสอักขระ) ใน Linux ได้อย่างไร


4
บทความสั้น ๆ : Unix Terminals: Surviving the Encoding Hell
miku

คำตอบ:


108

เทอร์มินัลใช้ตัวแปรสภาพแวดล้อมเพื่อกำหนดชุดอักขระที่จะใช้ดังนั้นคุณสามารถกำหนดได้โดยดูที่ตัวแปรเหล่านั้น:

echo $LC_CTYPE

หรือ

echo $LANG

4
ตัวแปรสภาพแวดล้อมเหล่านี้ใช้โดยแอ็พพลิเคชันที่ใช้เทอร์มินัลสำหรับ I / O ตัวจำลองเทอร์มินัลเองไม่มีความรู้ใด ๆ เลยและการเข้ารหัสอักขระที่มีประสิทธิภาพในปัจจุบันคือการตั้งค่าที่ใดที่หนึ่งภายในโปรแกรมอีมูเลเตอร์ (สมาชิกข้อมูลภายในคลาส libvte ในกรณีของ GNOME Terminal)
JdeBP

1
ลำดับของตัวแปรที่แนะนำในที่นี้ไม่ดี วิธีแก้ปัญหาที่สมบูรณ์กว่านี้จะเป็นดังนี้: echo $ {LC_ALL: - $ {LC_CTYPE: - $ {LANG}}} จากนั้นอีกครั้งตัวแปรที่ตั้งค่าไม่ได้เป็นการรับประกันว่าจะถูกต้องดังนั้นคุณควรยึดติดกับlocaleโปรแกรม (ดังที่เห็นในคำตอบอื่น ๆ ที่นี่)
Mike Frysinger

ดังที่ @JdeBP กล่าวว่าเทอร์มินัลไม่ได้ใช้localeตัวแปรสภาพแวดล้อมเพื่อกำหนดการเข้ารหัส อย่างไรก็ตามเทอร์มินัลสามารถให้แอปพลิเคชันที่โต้ตอบกับมันทราบการเข้ารหัสโดยการตั้งค่าlocaleตัวแปรสภาพแวดล้อม ยกตัวอย่างเช่นใน MacOS คุณสามารถเลือกการเข้ารหัสขั้วและเลือกที่จะตั้งค่าlocaleตัวแปรสภาพแวดล้อมที่เริ่มต้นในขั้วTerminal> Preferences> >Profiles Advanced
Maggyero

97

locale คำสั่งที่ไม่มีอาร์กิวเมนต์จะพิมพ์ค่าของตัวแปรสภาพแวดล้อมที่เกี่ยวข้องทั้งหมดยกเว้น LANGUAGE

สำหรับการเข้ารหัสปัจจุบัน:

locale charmap

สำหรับภาษาที่ใช้ได้:

locale -a

สำหรับการเข้ารหัสที่มีให้:

locale -m

1
นี่คือสิ่งที่ใช้ได้ผลสำหรับฉันในระบบ CentOS มันแสดงให้เห็นการเข้ารหัสระบบตามการตั้งค่าภาษาปัจจุบัน การตั้งค่าเทอร์มินัลที่ใช้ในการเข้าถึงเครื่องนั้นเป็นเรื่องราวที่แตกต่างกันและเป็นหน้าที่ของไคลเอ็นต์ที่ใช้
Phil DD

45

ตรวจสอบการเข้ารหัสและภาษา:

$ echo $LC_CTYPE
ISO-8859-1
$ echo $LANG
pt_BR

รับทุกภาษา:

$ locale -a

เปลี่ยนเป็น pt_PT.utf8:

$ export LC_ALL=pt_PT.utf8 
$ export LANG="$LC_ALL"

16

หากคุณมี Python:

python -c "import sys; print(sys.stdout.encoding)"

1
จากข้อเสนอทั้งหมดข้างต้นข้อเสนอแนะเดียวที่ใช้ได้กับกล่อง Slackware64 v. 14.2 ของฉันคือตัวอย่าง python นี้ ขอบคุณ!
Thomas Altfather Good

6

สำหรับความรู้ของฉันไม่

สิ่งบ่งชี้$LC_CTYPEโดยรอบlocaleและสิ่งเหล่านี้อาจดูน่าดึงดูด แต่สิ่งเหล่านี้จะแยกออกจากการเข้ารหัสแอปพลิเคชันเทอร์มินัลโดยสิ้นเชิง (จริง ๆ แล้วโปรแกรมจำลอง) จะใช้เมื่อแสดงอักขระบนหน้าจอ

วิธีเดียวในการตรวจจับการเข้ารหัสอย่างแน่นอนคือการส่งออกสิ่งที่มีอยู่ในการเข้ารหัสเท่านั้นเช่นäถ่ายภาพหน้าจอวิเคราะห์ภาพนั้นและตรวจสอบว่าอักขระเอาต์พุตนั้นถูกต้องหรือไม่

ไม่เป็นไปไม่ได้น่าเศร้า


0

หากต้องการดูข้อมูลโลแคลปัจจุบันให้ใช้localeคำสั่ง ด้านล่างนี้คือตัวอย่างของ RHEL 7.8

[usr@host ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.