คำถามมากมายเกี่ยวกับการเข้ารหัสอักขระระบบไฟล์บน linux


12

เนื่องจากการแลกเปลี่ยนไฟล์จำนวนมากทำงานระหว่าง Windows (การเข้ารหัสGBK ) และ Linux (การเข้ารหัส UTF-8 ) มันจะพบปัญหาการเข้ารหัสอักขระได้อย่างง่ายดายเช่น:

  • ไฟล์ zip / tar ที่มีชื่อมีตัวอักษรจีนในระบบ Windows ให้แตกซิป / untar ในระบบ Linux
  • เรียกใช้เว็บแอปพลิเคชัน java แบบเก่าที่ย้ายข้อมูล (ออกแบบบนระบบ Windows โดยใช้การเข้ารหัส GBK ใน JSP) ซึ่งเขียนไฟล์ที่เข้ารหัสด้วยชื่อ GBK ลงในดิสก์
  • ftp รับ / ใส่ไฟล์ที่มีชื่อเข้ารหัส GBK ระหว่างเซิร์ฟเวอร์ Windows FTP และไคลเอนต์ Linux
  • เปลี่ยนสภาพแวดล้อม LANG ใน Linux

ปัญหาทั่วไปของที่กล่าวถึงก่อนหน้าคือการระบุตำแหน่งไฟล์ / หลังจาก googled ฉันได้รับบทความการใช้ Unicode ใน Linux http://www.linux.com/archive/feed/39912ก็กล่าวว่า:

ระบบปฏิบัติการและยูทิลิตี้ต่าง ๆ ไม่ทราบว่าอักขระใดที่ไบต์ในชื่อไฟล์แสดง

ดังนั้นจึงเป็นไปได้ที่จะมีไฟล์ 2 中文 .txt ที่มีการเข้ารหัสแตกต่างกัน:

[root@fedora test]# ls
????  中文
[root@fedora test]# ls | iconv -f GBK
中文
涓iconv: illegal input sequence at position 7
[root@fedora test]# ls 中文 && ls $'\xd6\xd0\xce\xc4'|iconv -f gbk
中文
中文

คำถาม:

  1. เป็นไปได้หรือไม่ที่จะกำหนดค่าระบบไฟล์ linux ใช้การเข้ารหัสอักขระคงที่ (เช่นNTFSใช้ UTF-16 ภายใน) เพื่อจัดเก็บชื่อไฟล์โดยไม่คำนึงถึงสภาพแวดล้อม LANG / LC_ALL?
  2. หรือสิ่งที่ฉันต้องการถามคือ: เป็นไปได้ไหมที่จะปล่อยให้ชื่อไฟล์中文 .txt ( $'\xe4\xb8\xad\xe6\x96\x87.txt') ในสภาพแวดล้อม zh_CN.UTF-8 และชื่อไฟล์中文 .txt ( $'\xd6\xd0\xce\xc4.txt') ในสภาพแวดล้อม zh_CN.GBK อ้างถึงไฟล์เดียวกัน ?
  3. หากไม่สามารถกำหนดค่าได้คุณสามารถแก้ไขเคอร์เนลเพื่อแปลการเข้ารหัสอักขระระหว่างระบบไฟล์และสภาพแวดล้อมปัจจุบันได้หรือไม่ และประสิทธิภาพจะมีผลกระทบเท่าใดหากเป็นไปได้

คุณสามารถจัดการปัญหาจากฝั่ง Windows โดยใช้ Cygwin 1.7 ซึ่งแปลโดยอัตโนมัติระหว่างการเข้ารหัส UTF-16 ของระบบไฟล์และการเข้ารหัสใด ๆ ที่ระบุไว้ในการตั้งค่าโลแคล มันเริ่มต้นที่ UTF-8 ดังนั้นตัวอย่างเช่น Cygwin tar จะเข้ารหัสชื่อไฟล์เป็น UTF-8
ak2

@ ak2 ขอบคุณ Cygwin ดีจริงๆฉันใช้มันมาหลายปีแล้ว เคส tar / zip เป็นเพียงตัวอย่างในสภาพแวดล้อมจริงไฟล์ zip / tar อาจถูกสร้างขึ้นโดยผู้อื่น (เช่นดาวน์โหลดไฟล์จากอินเทอร์เน็ต)
LiuYan 刘研

คำตอบ:


8

ฉันปรับรูปแบบคำถามของคุณอีกเล็กน้อยด้วยเหตุผลที่ควรปรากฏชัดเจนเมื่อคุณอ่านตามลำดับ

1. เป็นไปได้ไหมที่จะกำหนดค่าระบบไฟล์ linux ให้ใช้การเข้ารหัสอักขระคงที่เพื่อจัดเก็บชื่อไฟล์โดยไม่คำนึงถึงสภาพแวดล้อม LANG / LC_ALL?

ไม่เป็นไปไม่ได้: เมื่อคุณพูดถึงคำถามของคุณชื่อไฟล์ UNIX นั้นเป็นเพียงลำดับไบต์ เคอร์เนลไม่รู้อะไรเกี่ยวกับการเข้ารหัสซึ่งเป็นแนวคิดของพื้นที่ผู้ใช้ (เช่นระดับแอปพลิเคชัน)

อีกนัยหนึ่งเคอร์เนลไม่รู้อะไรเกี่ยวกับLANG/ LC_*ดังนั้นจึงไม่สามารถแปลได้

2. เป็นไปได้ไหมที่จะให้ชื่อไฟล์ต่าง ๆ อ้างถึงไฟล์เดียวกัน?

คุณสามารถมีหลายรายการไดเรกทอรีที่อ้างถึงไฟล์เดียวกัน คุณสามารถทำให้ที่ผ่านการเชื่อมโยงอย่างหนักหรือการเชื่อมโยงสัญลักษณ์

อย่างไรก็ตามโปรดทราบว่าชื่อไฟล์ที่ไม่ถูกต้องในการเข้ารหัสปัจจุบัน (เช่นสตริงอักขระ GBK ของคุณเมื่อคุณทำงานในภาษา UTF-8) จะแสดงผลไม่ดีถ้าหากทั้งหมด

3. เป็นไปได้ไหมที่จะแก้ไขเคอร์เนลเพื่อแปลการเข้ารหัสอักขระระหว่างระบบไฟล์และสภาพแวดล้อมปัจจุบัน?

คุณไม่สามารถปะแก้เคอร์เนลเพื่อทำสิ่งนี้ได้ (ดู 1. ) แต่คุณสามารถ - ในทางทฤษฎี - ปะแก้ไลบรารี C (เช่น glibc) เพื่อทำการแปลนี้และแปลงชื่อไฟล์เป็น UTF-8 เสมอเมื่อมันเรียกเคอร์เนล และแปลงเป็นการเข้ารหัสปัจจุบันเมื่ออ่านชื่อไฟล์จากเคอร์เนล

วิธีที่ง่ายกว่าคือการเขียนระบบไฟล์แบบซ้อนทับด้วยFUSEซึ่งเพิ่งเปลี่ยนเส้นทางการร้องขอระบบไฟล์ไปยังตำแหน่งอื่นหลังจากแปลงชื่อไฟล์เป็น / จาก UTF-8 เป็นการดีที่คุณสามารถติดตั้งระบบแฟ้มนี้~/transและเมื่อมีการเข้าถึงจะทำ ~/trans/a/GBK/encoded/pathแล้วระบบแฟ้ม FUSE /a/UTF-8/encoded/pathจริงๆเข้าถึง

อย่างไรก็ตามปัญหาของวิธีการเหล่านี้คือ: คุณทำอะไรกับไฟล์ที่มีอยู่แล้วในระบบไฟล์ของคุณและไม่ได้เข้ารหัส UTF-8 คุณไม่เพียงแค่ส่งผ่านพวกเขาโดยไม่แปลเพราะคุณไม่รู้วิธีแปลง คุณไม่สามารถรวมเข้าด้วยกันโดยการแปลลำดับอักขระที่ไม่ถูกต้องเป็น?เพราะอาจทำให้เกิดข้อขัดแย้ง ...


4
เช่นระบบไฟล์ที่ซ้อนทับอยู่: Convmvfs
Gilles 'หยุดความชั่วร้าย'

1

สิ่งที่คุณสามารถทำได้คือ จำกัด จำนวนของสถานที่ที่ได้รับการสนับสนุนไปยังสถานที่ UTF-8 เท่านั้น

http://www.fifi.org/cgi-bin/man2html/usr/share/man/man5/locale.gen.5


2
โดยส่วนตัวแล้วฉันหวังว่าจะมีเพียง 1 charset encoding (UTF-8) ในโลก แต่มีแอปพลิเคชันรุ่นเก่าที่ยังคงทำงานอยู่และการทำงานร่วมกันระหว่าง Windows และ Linux ต้องประสบความสำเร็จคนส่วนใหญ่ต้องเผชิญกับฝันร้าย
LiuYan 刘研
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.