लिनक्स पर फ़ाइल नाम और रास्तों के लिए कौन सी चारसेट एन्कोडिंग का उपयोग किया जाता है?


45

क्या यह निर्भर करता है कि मैं किस फाइल सिस्टम का उपयोग करता हूं? उदाहरण के लिए, ext2 / ext3 / ext4 लेकिन यह भी तब होता है जब मैं आईएसओ 9660 के साथ उन "जूलियट" सीडी-रोम में से एक सम्मिलित करता हूं? मैंने सुना है कि POSIX में फ़ाइल नाम के चारसेट एन्कोडिंग के लिए किसी प्रकार की कल्पना है?

अनिवार्य रूप से, मुझे आश्चर्य होता है कि अगर मुझे UTF-8 एनकोडेड फ़ाइल नाम मिला है, तो लिनक्स में I / O API को फ़ाइल में पास करने से पहले मुझे क्या करने की आवश्यकता है?


नीचे दिए गए उत्तर कहते हैं कि ओएस और फाइल सिस्टम एन्कोडिंग की परवाह नहीं करता है। कुछ फाइलसिस्टम, जैसे कि HFS +, काफी हद तक देखभाल करते हैं। HFS +, मेरा मानना ​​है कि UTF-8 की आवश्यकता है, जो इसे UTF-16 की सीमित बोली में आंतरिक रूप से परिवर्तित करता है। NTFS के पास भी एक समान मुद्दा है लेकिन मैं विवरणों पर स्पष्ट नहीं हूं।
zmccord

HFS + को यह भी आवश्यक है कि नामों को विघटित किया जाए जो कि पहले से उपयोग किए जाने वाले लिनक्स की प्रवृत्ति के साथ अच्छा नहीं खेलते हैं। web.archive.org/web/20080518105836/http://developer.apple.com/…
user12439

जवाबों:


49

जैसा कि दूसरों ने नोट किया है, वास्तव में इसका जवाब नहीं है: फाइलनाम और रास्तों में एन्कोडिंग नहीं है; ओएस केवल बाइट्स के अनुक्रम से संबंधित है। व्यक्तिगत अनुप्रयोग उन्हें किसी तरह से एन्कोड किए जाने के रूप में व्याख्या करने के लिए चुन सकते हैं, लेकिन यह भिन्न होता है।

विशेष रूप से, Glib (Gtk + apps द्वारा उपयोग किया जाता है) मानता है कि सभी फ़ाइल नाम UTF-8 एन्कोडेड हैं, चाहे उपयोगकर्ता के लोकेल की परवाह किए बिना । इसे पर्यावरण चर G_FILENAME_ENCODING और G_BROKEN_FILENAMES के साथ ओवरराइड किया जा सकता है ।

दूसरी ओर, क्यूटी यह मानने में चूक करता है कि सभी फ़ाइल नाम वर्तमान उपयोगकर्ता के स्थान में एन्कोड किए गए हैं । एक व्यक्तिगत अनुप्रयोग इस धारणा को ओवरराइड करने का विकल्प चुन सकता है, हालांकि मुझे ऐसा करने की कोई जानकारी नहीं है, और कोई बाहरी ओवरराइड स्विच नहीं है।

आधुनिक लिनक्स वितरण ऐसे स्थापित किए गए हैं कि सभी उपयोगकर्ता UTF-8 स्थानों का उपयोग कर रहे हैं और विदेशी फाइल सिस्टम माउंट पर पथों को UTF-8 में अनुवादित किया गया है, इसलिए रणनीतियों में इस अंतर का आमतौर पर कोई प्रभाव नहीं पड़ता है। हालाँकि, यदि आप वास्तव में सुरक्षित रहना चाहते हैं, तो आप "NUL- टर्मिनेटेड, '/' - बाइट्स के सीमांकित अनुक्रम से परे फ़ाइल नाम के बारे में कोई संरचना नहीं मान सकते।"

(यह भी ध्यान दें: स्थानीय प्रक्रिया के अनुसार भिन्न हो सकते हैं। एक ही उपयोगकर्ता द्वारा संचालित दो अलग-अलग प्रक्रियाएं अलग-अलग स्थानों में हो सकती हैं।


1
"एनयूएल-टर्मिनेटेड, '/' - बाइट्स का सीमांकित अनुक्रम" लेकिन एन्कोडिंग के बिना, आपको कैसे पता चलेगा कि बाइट '/' का प्रतिनिधित्व करती है?
जैक

1
@ जेक हमेशा '\x2F'की तरह दिखता है की परवाह किए बिना /। एसजेआईएस में विशेष रूप से भिन्न।
शाम

1
आह ठीक है। क्या आप उस जानकारी के साथ उत्तर को अपडेट करने पर विचार करेंगे? शायद यह सिर्फ इसलिए कि मैंने हाल ही में एक चारसेट रूपांतरण पुस्तकालय पर काम किया है, लेकिन वाक्यांश "/ '- बाइट्स का सीमांकित अनुक्रम" मेरे लिए कोई मतलब नहीं है।
जैक

तो हेक्स में SSH सत्र में फ़ाइल नाम का बाइट कैसे देखें?
धुंधली हो जाती है

11

लिनक्स के यूनिक्स / पॉज़िक्स परत का ध्यान नहीं है कि आप किस एन्कोडिंग का उपयोग करते हैं। यह आपके वर्तमान एन्कोडिंग के बाइट अनुक्रम को यथास्थान संग्रहीत करता है।

मुझे लगता है कि वे माउंट विकल्प हैं जो आपको विशिष्ट फाइल सिस्टम को बदलने में मदद करने के लिए हैं जो आपके सिस्टम को चारसेट में परिभाषित करते हैं। (CDROM, NTFS और FAT वेरिएंट कुछ यूनिकोड वेरिएंट का उपयोग करते हैं)।

मेरी इच्छा है कि यूनिक्स एक सिस्टम ग्लोबल एन्कोडिंग को परिभाषित करे, लेकिन यह वास्तव में प्रति उपयोगकर्ता सेटिंग है। इसलिए यदि आप एक अलग एन्कोडिंग को परिभाषित करते हैं तो आपका कोलीग, आपका फ़ाइलनाम अलग-अलग दिखाई देगा।


ठीक है, तो मुझे संभवतः यह देखना चाहिए कि उपयोगकर्ता वर्तमान में किस लोकेल का उपयोग कर रहा है और नई फ़ाइलों के लिए इसे रूपांतरित कर रहा है ताकि वह फ़ाइल नाम सही ढंग से Nautilus आदि में देख सके। मैं कैसे बता सकता हूँ कि वर्तमान उपयोगकर्ता के लिए वर्तमान फ़ाइल नाम चारसेट क्या है?
मार्टिन

1
@ स्मार्टिन यह इतना सरल भी नहीं है ... विभिन्न प्रक्रियाएं अलग-अलग एनकोडिंग का उपयोग कर सकती हैं, जो एन वी चर पर निर्भर करता है और भाषा में लिखा गया था।
बेसिक

5

यह निर्भर करता है कि आप फ़ाइल सिस्टम को कैसे माउंट करते हैं, बस अलग-अलग फ़ाइल सिस्टम के लिए माउंट विकल्पों पर एक नज़र डालें man mount। उदाहरण के लिए iso9660, vfatऔर fatहै iocharsetऔर utf8विकल्प।


इसलिए अगर मैं इसे utf8 का उपयोग करके माउंट करता हूं, तो क्या मुझे utf8 को खुले () syscall में पास करना चाहिए?
मार्टीन

इसके अलावा मुझे यह ( Library.gnome.org/devel/glib/unstable/… ) मिला, जो यह दर्शाता है कि फ़ाइलनाम की चारसेट एन्कोडिंग लोकेल सेट पर निर्भर है?
मार्टीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.