การเข้ารหัสชุดอักขระใดที่ใช้สำหรับชื่อไฟล์และเส้นทางบน Linux


45

มันขึ้นอยู่กับระบบไฟล์ที่ฉันใช้หรือไม่? ตัวอย่างเช่น ext2 / ext3 / ext4 แต่จะเกิดอะไรขึ้นเมื่อฉันใส่หนึ่งในซีดี "joliet" กับ ISO 9660 ฉันได้ยินมาว่า POSIX มีข้อมูลจำเพาะบางอย่างสำหรับการเข้ารหัสชุดอักขระของชื่อไฟล์หรือไม่

โดยพื้นฐานแล้วสิ่งที่ฉันสงสัยคือถ้าฉันได้รับชื่อไฟล์ที่เข้ารหัส UTF-8 ฉันต้องทำอะไรในการประมวลผล / การแปลงข้อมูลก่อนที่จะส่งต่อไปยังไฟล์ I / O API ใน Linux


คำตอบด้านล่างบอกว่าระบบปฏิบัติการและระบบไฟล์ไม่สนใจการเข้ารหัส ระบบไฟล์บางระบบเช่น HFS + ให้ความสนใจเป็นอย่างมาก ฉันเชื่อว่า HFS + ต้องใช้ UTF-8 ซึ่งแปลงภายในเป็นภาษาถิ่นที่ จำกัด ของ UTF-16 NTFS ยังมีปัญหาที่คล้ายกัน แต่ฉันไม่ชัดเจนในรายละเอียด
zmccord

HFS + ต้องการชื่อที่ถูกย่อยซึ่งไม่เล่นได้ดีกับแนวโน้มของ linux ที่จะใช้ precomposed web.archive.org/web/20080518105836/http://developer.apple.com/?hl=th
12439

คำตอบ:


49

ดังที่ผู้อื่นระบุไว้ไม่มีคำตอบสำหรับเรื่องนี้จริงๆ: ชื่อไฟล์และเส้นทางไม่มีการเข้ารหัส; ระบบปฏิบัติการเกี่ยวข้องเฉพาะกับลำดับของไบต์เท่านั้น แอปพลิเคชั่นส่วนบุคคลอาจเลือกที่จะตีความว่าเป็นการเข้ารหัสในบางวิธี

โดยเฉพาะกะล่อน (ใช้แอพพลิเค Gtk +) สมมติว่าชื่อไฟล์ทั้งหมดจะถูกเข้ารหัส UTF-8 โดยไม่คำนึงถึงสถานที่ของผู้ใช้ นี้อาจจะถูกแทนที่ด้วยตัวแปรสภาพแวดล้อมG_FILENAME_ENCODINGและG_BROKEN_FILENAMES

บนมืออื่น ๆ , ค่าเริ่มต้นของ Qt จะสมมติว่าชื่อไฟล์ทั้งหมดจะถูกเข้ารหัสในสถานที่ของผู้ใช้ปัจจุบัน แอปพลิเคชันแต่ละรายการอาจเลือกที่จะแทนที่สมมติฐานนี้แม้ว่าฉันจะไม่ทราบถึงสิ่งที่ทำและไม่มีการแทนที่ภายนอก

การตั้งค่าลีนุกซ์แบบลีนุกซ์สมัยใหม่นั้นผู้ใช้ทุกคนกำลังใช้ภาษา UTF-8 และเส้นทางบนระบบไฟล์ต่างประเทศที่เมาท์จะถูกแปลเป็น UTF-8 ดังนั้นความแตกต่างในกลยุทธ์นี้โดยทั่วไปจึงไม่มีผลกระทบใด ๆ อย่างไรก็ตามถ้าคุณต้องการที่จะปลอดภัยจริง ๆ คุณไม่สามารถสรุปโครงสร้างใด ๆ เกี่ยวกับชื่อไฟล์ที่เกิน "NUL-terminated, '/' - ลำดับของไบต์ที่คั่นด้วย"

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


1
"NUL-terminated, '/' - ลำดับของไบต์แบบมีตัวคั่น" แต่หากไม่มีการเข้ารหัสคุณจะรู้ได้อย่างไรว่าไบต์ใดแทน '/'
แจ็ค

1
@Jack เสมอโดยไม่คำนึงถึงสิ่งที่ดูเหมือนว่า'\x2F' /แตกต่างอย่างมากใน SJIS
ephemient

1
อ่าโอเค. คุณจะพิจารณาปรับปรุงคำตอบด้วยข้อมูลนั้นหรือไม่? อาจเป็นเพราะฉันเพิ่งทำงานกับไลบรารีการแปลงชุดอักขระ แต่วลี "'/' - ลำดับของไบต์ที่คั่นด้วย" ไม่สมเหตุสมผลสำหรับฉัน
แจ็ค

ดังนั้นวิธีดูไบต์ของชื่อไฟล์ในเซสชัน SSH ใน HEX
Dims

11

เลเยอร์ unix / posix ของ linux ไม่สนใจว่าคุณใช้การเข้ารหัสแบบใด มันเก็บลำดับไบต์ของการเข้ารหัสปัจจุบันของคุณตามที่เป็น

ฉันคิดว่าตัวเลือกการเมานต์เหล่านั้นอยู่ที่นั่นเพื่อช่วยให้คุณแปลงระบบไฟล์เฉพาะที่กำหนดชุดอักขระเป็นชุดอักขระระบบของคุณ (CDROMs, NTFS และตัวแปร FAT ใช้ตัวแปรยูนิโคดบางตัว)

ฉันหวังว่ายูนิกซ์จะกำหนดระบบการเข้ารหัสทั่วโลก แต่จริงๆแล้วเป็นการตั้งค่าต่อผู้ใช้ ดังนั้นหากคุณกำหนดการเข้ารหัสที่แตกต่างกันดังนั้นเพื่อนร่วมงานของคุณชื่อไฟล์ของคุณจะปรากฏแตกต่างกัน


ตกลงดังนั้นฉันควรจะตรวจสอบว่าผู้ใช้กำลังใช้ตำแหน่งที่ตั้งใดอยู่และแปลงเป็นไฟล์ใหม่เพื่อให้เขาเห็นชื่อไฟล์อย่างถูกต้องใน Nautilus เป็นต้นฉันจะทราบได้อย่างไรว่าชื่อไฟล์ปัจจุบันมีอะไรบ้างสำหรับผู้ใช้ปัจจุบัน
martin

1
@martin มันไม่ง่ายอย่างนั้น ... กระบวนการต่าง ๆ สามารถใช้การเข้ารหัสที่แตกต่างกันได้ขึ้นอยู่กับตัวแปร env และภาษาที่ใช้เขียน
พื้นฐาน

5

มันขึ้นอยู่กับว่าคุณจะติดระบบไฟล์เพียงแค่ใช้เวลาดูที่ตัวเลือก mount man mountสำหรับระบบไฟล์ที่แตกต่างกันใน ตัวอย่างเช่นiso9660, vfatและfatมีiocharsetและutf8ตัวเลือก


ดังนั้นหากฉันติดตั้งโดยใช้ utf8 ฉันควรส่ง utf8 ไปยัง syscall แบบเปิด () ด้วยหรือไม่
martin

นอกจากนี้ฉันยังพบสิ่งนี้ ( library.gnome.org/devel/glib/unstable/ ...... ) ซึ่งดูเหมือนว่าบ่งบอกว่าการเข้ารหัสชุดอักขระของชื่อไฟล์ขึ้นอยู่กับตำแหน่งที่ตั้งใด
martin
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.