दिलचस्प पोस्ट
तीन। जेएस: स्थिति के रूप में एक ही सदिश का उपयोग करके 2x मेज़ डोमेन एक्सटेंशन निकालें क्या मैं इन्हें स्थापित करने के बिना मेहर 2 बिल्ड क्लासपाथ को जार जोड़ सकता हूं? रेगेक्स को गठजोड़ करें HTML <input type = 'file'> एक फिल्टर लागू करें स्ट्रिंग के लिए नल जोड़ना क्यों कानूनी है? अजगर के लिए auto.arima () समकक्ष पोस्टग्रेज़: तालिका को विदेशी कुंजी में सूचीबद्ध करने के लिए SQL फ़ाइल या असेंबली को 'एंट्ल्र 3.रेंटाइम (1)' या इसके निर्भरता में से एक लोड नहीं किया जा सका क्या जावा का उपयोग कर ऑपरेटिंग सिस्टम बनाना संभव है? regex.test वीएस string.match पता करने के लिए कि एक स्ट्रिंग एक नियमित अभिव्यक्ति से मेल खाता है अनाम पुनरावर्ती PHP फ़ंक्शन क्या जावास्क्रिप्ट में एक नींद / रोकें / प्रतीक्षा समारोह है? जीआईटी बैश मेरे पाथ को नहीं देखती मैं सी # में क्लिपबोर्ड सामग्री परिवर्तनों की निगरानी कैसे करूं?

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

मैं सिर्फ कुछ प्रोग्रामिंग पर एक WinXP सिस्टम पर गैर-अंग्रेजी नामों के साथ फाइल नामों को संभालने के लिए शुरू कर रहा हूं। मैंने यूनिकोड पर कुछ सुझाई गई पढ़ाई की है और मुझे लगता है कि मुझे मूल विचार मिलता है, लेकिन कुछ हिस्सों अभी भी मेरे लिए बहुत स्पष्ट नहीं हैं

विशेष रूप से, क्या एन्कोडिंग (UTF-8, UTF-16LE / BE) फ़ाइल नाम हैं (सामग्री की नहीं, बल्कि फ़ाइल का वास्तविक नाम) NTFS में संग्रहीत? क्या एफओपीएएन () का उपयोग करते हुए किसी भी फाइल को खोलना संभव है, जो चार * का उपयोग करता है, या मेरे पास wfopen () का उपयोग करने के लिए कोई विकल्प नहीं है, जो कि wchar_t * का उपयोग करता है, और संभवतः एक UTF-16 स्ट्रिंग लेता है?

मैंने एक UTF-8 एन्कोडेड स्ट्रिंग में मैन्युअल रूप से फीडिंग की कोशिश की, उदाहरण के लिए।

unsigned char filename[] = {0xEA, 0xB0, 0x80, 0x2E, 0x74, 0x78, 0x74, 0x0}; // 가.txt FILE* f = fopen((char*)filename, "wb+"); 

लेकिन यह 'ê ° € .txt' के रूप में बाहर आया

मुझे इस धारणा के तहत (जो गलत हो सकता है) कि एक यूटीएफ 8-एन्कोडेड स्ट्रिंग विंडोज के तहत किसी फ़ाइल नाम को खोलने में पर्याप्त होगा, क्योंकि मुझे लगता है कि कुछ विंडोज़ अनुप्रयोग (चार *) से गुजरते हुए, (wchar_t *) नहीं, और कोई समस्या नहीं।

क्या कोई इस पर रोशनी डाल सकता है?

Solutions Collecting From Web of "क्या एनटीएफएस में फाइल एन्कोडिंग को संग्रहीत किया जाता है?"

NTFS फाइलनामों को UTF16 में संग्रहीत करता है, हालांकि Fopen ANSI (utf8 नहीं) का उपयोग कर रहा है।

एक यूटीएफ 16-एन्कोडेड फ़ाइल नाम का उपयोग करने के लिए आपको फ़ाइल के यूनिकोड संस्करणों को खुले कॉलों का उपयोग करने की आवश्यकता होगी। अपने परियोजना में यूनिकोड और _UNICODE को परिभाषित करके इसे करें फिर CreateFile कॉल या wfopen कॉल का उपयोग करें।

Fopen () – विंडोज़ में एमएसवीसी में (डिफ़ॉल्ट रूप से) एक यूटीएफ -8 एनकोडेड चार * नहीं लेते हैं।

दुर्भाग्य से यूटीएफ -8 का हाल ही में चीजों की महान योजना में आविष्कार किया गया था। विंडोज एपीआई को यूनिकोड और एनसीआई संस्करणों में बांटा गया है। प्रत्येक विंडो एपीआई जो स्ट्रिंग के साथ लेता है या संबंधित है, वास्तव में डब्ल्यू या एप्रिक्स के साथ उपलब्ध है – W के लिए "वाइड" वर्ण / यूनिकोड और ए के लिए Ansi मैक्रो जादू यह सब डेवलपर से दूर छुपाता है ताकि आप फ़र्क को जानने के बिना अपने बिल्ड कॉन्फ़िगरेशन के आधार पर केवल एक चार * या एक wchar_t * के साथ CreateFile कॉल करें।

'एन्सी' एन्कोडिंग वास्तव में एक विशिष्ट एन्कोडिंग नहीं है: – लेकिन इसका मतलब है कि "चार" स्ट्रिंग्स के लिए इस्तेमाल एन्कोडिंग पीसी के लोकेल सेटिंग के लिए विशिष्ट है।

अब, क्योंकि सी-रनटाइम फ़ंक्शंस – जैसे फ़ॉपन – डेवलपर ज्ञान के बिना डिफ़ॉल्ट रूप से काम करने की ज़रूरत है – विंडोज़ सिस्टम पर वे विंडोज़ स्थानीय एन्कोडिंग में अपने तार प्राप्त करने की अपेक्षा करते हैं। एमएसडीएन इंगित करता है कि माइक्रोसॉफ्ट सी-रनटाइम एपीआई सेटलोकल मौजूदा थ्रेड के लोकेल को बदल सकता है – लेकिन विशेष रूप से कहता है कि यह किसी भी लोकेल के लिए असफल हो जायेगा, जिसकी प्रत्येक चरित्र में 2 बाइट्स से अधिक की आवश्यकता होगी – जैसे कि यूटीएफ -8

इसलिए, विंडोज पर कोई शॉर्टकट नहीं है Wchar_t * तारों के साथ आपको wfopen, या देशी API CreateFileW (या अपनी प्रोजेक्ट को यूनिकोड बिल्ड सेटिंग्स का उपयोग करके और सिर्फ Createfile पर कॉल करें) का उपयोग करने की आवश्यकता है

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

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

  1. UTF-16 को यूटीएफ -8 का प्रतिनिधित्व MultiByteToWideChar का उपयोग करके कनवर्ट करें।

  2. "शॉर्ट मार्ग" प्राप्त करने के लिए GetShortPathNameW का उपयोग करें जो कि एएससीआईआई-केवल है। GetShortPathNameW इसे सभी-एएससीआईआई सामग्री के साथ एक व्यापक स्ट्रिंग के रूप में लौटाएगा, जिसे आपको इसे एक संकीर्ण स्ट्रिंग में एक GetShortPathNameW स्ट्रिंग के रूप में परिवर्तित करने की आवश्यकता होगी, जिसमें प्रत्येक wchar_t char कास्टिंग होगा।

  3. fopen() या उस कोड के लिए लघु पथ को पास करें जो अंततः fopen() उपयोग करेगा। ध्यान रखें कि उस कोड द्वारा त्रुटि संदेशों को मुद्रित किया गया है, यदि कोई है, तो भद्दा "शॉर्ट पाथ" (उदाहरण के लिए, kinto-un-筋斗雲 बजाय KINTO~1 ) का kinto-un-筋斗雲

हालांकि यह वास्तव में अनुशंसित दीर्घकालिक रणनीति नहीं है, क्योंकि विंडोज़ लघु पथ एक लेगेसी फीचर हैं जो कि प्रति-वॉल्यूम को बंद किया जा सकता है, यह संभव है कि फ़ाइल नामों को fopen() और अन्य फ़ाइल- संबंधित एपीआई कॉल ( stat , access , एएनएसआई संस्करण, CreateFile और इसी तरह)