लिनक्स पर फाइल-सिस्टम कैरेक्टर एन्कोडिंग के बारे में कई सवाल


12

विंडोज ( जीबीके एन्कोडिंग) और लिनक्स ( यूटीएफ -8 एन्कोडिंग) के बीच बहुत सारे फ़ाइल विनिमय कार्यों के कारण , यह आसानी से चरित्र एन्कोडिंग मुद्दों का सामना करेगा, जैसे:

  • zip / tar फाइलें जिनके नाम में विंडोज सिस्टम पर चीनी अक्षर हैं, लिनक्स सिस्टम में अनजिप / अनटार करें।
  • माइग्रेटेड लीगेसी जावा वेब एप्लिकेशन (विंडोज सिस्टम पर डिज़ाइन किया गया है, जेएसपी में जीबीके एन्कोडिंग का उपयोग करके) जो डिस्क पर जीबीके-एन्कोडिंग-नाम वाली फाइलें लिखता है।
  • FTP FTP / Windows- FTP सर्वर और लिनक्स क्लाइंट के बीच GBK- एनकोडिंग नाम की फाइलें डालते हैं।
  • लिनक्स में LANG पर्यावरण स्विच करें।

पिछले उल्लेख के आम मुद्दे फ़ाइल का पता लगाने / नामकरण कर रहे हैं। गुग्ल होने के बाद, मुझे लिनक्स में यूनिकोड का उपयोग करके एक लेख मिला है http://www.linux.com/archive/feed/39912 , यह कहा गया है:

ऑपरेटिंग सिस्टम और कई उपयोगिताओं का एहसास नहीं है कि फ़ाइल नामों में बाइट्स किस वर्ण का प्रतिनिधित्व करते हैं।

इसलिए, विभिन्न एन्कोडिंग वाली 2 t .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. क्या LANG / LC_ALL वातावरण की परवाह किए बिना फ़ाइल नामों को संग्रहीत करने के लिए लिनक्स फाइल सिस्टम को निश्चित वर्ण एन्कोडिंग (जैसे NTFS उपयोग आंतरिक रूप से उपयोग करना) को कॉन्फ़िगर करना संभव है?
  2. या, क्या मैं वास्तव में पूछना चाहते हैं: जाने के लिए क्या यह संभव है फ़ाइल नाम中文.txt ( $'\xe4\xb8\xad\xe6\x96\x87.txt'zh_CN.UTF -8 पर्यावरण और फ़ाइल नाम中文.txt (में) $'\xd6\xd0\xce\xc4.txt'zh_CN.GBK वातावरण में) एक ही फाइल को देखें ?
  3. यदि यह कॉन्फ़िगर करने योग्य नहीं है, तो क्या फ़ाइल-सिस्टम और वर्तमान वातावरण के बीच वर्ण एन्कोडिंग का अनुवाद करने के लिए कर्नेल को पैच करना संभव है (बस एक प्रश्न, कार्यान्वयन का अनुरोध नहीं)? और कितना संभव हो तो प्रदर्शन पर असर पड़े?

आप सिग्विन 1.7 का उपयोग करके विंडोज की ओर से समस्या से निपट सकते हैं, जो स्वचालित रूप से फाइलसिस्टम के यूटीएफ -16 एन्कोडिंग के बीच अनुवाद करता है और स्थानीय सेटिंग्स में जो भी एन्कोडिंग निर्दिष्ट किया गया है। यह यूटीएफ -8 में चूक करता है, इसलिए उदाहरण के लिए सिगविन टार यूटीएफ -8 के रूप में फाइलनाम को एन्कोड करेगा।
ak2

@ ak2 धन्यवाद, Cygwin वास्तव में अच्छा है, मैं इसे सालों से इस्तेमाल कर रहा हूं। टार / जिप मामला सिर्फ एक उदाहरण है, वास्तविक वातावरण में, जिप / टार फाइलें दूसरों द्वारा बनाई जा सकती हैं (जैसे कि इंटरनेट से फाइल डाउनलोड करना)।
लियूयान

जवाबों:


8

मैंने आपके प्रश्नों को थोड़ा सुधार दिया है, उन कारणों के लिए जो आपको अनुक्रम में पढ़ने पर स्पष्ट दिखाई देने चाहिए।

1. क्या LANG / LC_ALL वातावरण की परवाह किए बिना फ़ाइल नाम को संचित करने के लिए लिनक्स फाइलसिस्टम का उपयोग निश्चित वर्ण एन्कोडिंग को कॉन्फ़िगर करना संभव है?

नहीं, यह संभव नहीं है: जैसा कि आप अपने प्रश्न में उल्लेख करते हैं, एक यूनिक्स फ़ाइल नाम सिर्फ बाइट्स का एक क्रम है; कर्नेल एन्कोडिंग के बारे में कुछ नहीं जानता है, जो पूरी तरह से एक उपयोगकर्ता-स्थान (यानी, एप्लिकेशन-स्तर) अवधारणा है।

दूसरे शब्दों में, कर्नेल LANG/ के बारे में कुछ नहीं जानता है LC_*, इसलिए यह अनुवाद नहीं कर सकता है।

2. क्या अलग-अलग फ़ाइल नामों को एक ही फ़ाइल के लिए संदर्भित करना संभव है?

आपके पास एक ही फ़ाइल के संदर्भ में कई निर्देशिका प्रविष्टियाँ हो सकती हैं; आप इसे हार्ड लिंक या प्रतीकात्मक लिंक के माध्यम से बना सकते हैं ।

हालाँकि, ध्यान रखें कि फ़ाइल नाम जो वर्तमान एन्कोडिंग में मान्य नहीं हैं (उदाहरण के लिए, जब आप UTF-8 लोकेल में काम कर रहे हैं तो आपका GBK वर्ण स्ट्रिंग) बुरी तरह से प्रदर्शित होगा, यदि बिल्कुल भी।

3. क्या फ़ाइल-सिस्टम और वर्तमान परिवेश के बीच वर्ण एन्कोडिंग का अनुवाद करने के लिए कर्नेल को पैच करना संभव है?

आप ऐसा करने के लिए कर्नेल को पैच नहीं कर सकते (1. देखें), लेकिन आप इस सिद्धांत को निष्पादित करने के लिए C लाइब्रेरी (जैसे, glibc) को पैच कर सकते हैं और कर्नेल को कॉल करने पर हमेशा फ़ाइल नाम को UTF-8 में परिवर्तित कर सकते हैं, और कर्नेल से फ़ाइल नाम पढ़ते समय उन्हें वर्तमान एन्कोडिंग में परिवर्तित करें।

FUSE के साथ एक ओवरले फाइल सिस्टम लिखने के लिए एक सरल तरीका हो सकता है , कि यूटीएफ -8 से फ़ाइल नाम को / में परिवर्तित करने के बाद किसी भी फाइल सिस्टम को किसी अन्य स्थान पर पुनर्निर्देशित किया जाए। आदर्श रूप से आप इस फाइलसिस्टम को माउंट कर सकते हैं ~/transऔर जब एक एक्सेस किया जाता है ~/trans/a/GBK/encoded/pathतब FUSE फाइल सिस्टम वास्तव में एक्सेस करता है /a/UTF-8/encoded/path

हालांकि, इन दृष्टिकोणों के साथ समस्या यह है: आप उन फ़ाइलों के साथ क्या करते हैं जो पहले से ही आपके फाइल सिस्टम पर मौजूद हैं और UTF-8 एनकोडेड नहीं हैं? आप बस उन्हें बिना पढ़े पास नहीं कर सकते, क्योंकि तब आप उन्हें परिवर्तित करना नहीं जानते हैं; आप अवैध चरित्र अनुक्रमों का अनुवाद करके उन्हें नहीं जोड़ सकते ?क्योंकि इससे विरोध पैदा हो सकता है ...


4
इस तरह के एक ओवरले फाइल सिस्टम मौजूद है: कॉनवमफ़्स
गिल्स एसओ- बुराई को रोकें '

1

आप जो कर सकते हैं वह केवल UTF-8 स्थानों पर समर्थित स्थानों की मात्रा को सीमित करता है।

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


2
व्यक्तिगत रूप से, मैं चाहता हूं कि दुनिया में केवल 1 चारसेट एन्कोडिंग (UTF-8) हो, लेकिन अभी भी विरासत अनुप्रयोग चल रहे हैं, और विंडोज और लिनक्स के बीच अंतर को प्राप्त किया जाना चाहिए, ज्यादातर लोगों को इस दुःस्वप्न का सामना करना होगा।
लियूयान
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.