NSData

2009-08-29 12 views
15

से एनएसएसटींग बनाने के दौरान एन्कोडिंग का अनुमान लगाएं फ़ाइल से NSString पढ़ते समय मैं initWithContentsOfFile:usedEncoding:error: का उपयोग कर सकता हूं और यह फ़ाइल के एन्कोडिंग का अनुमान लगाएगा।NSData

जब मैं इसे NSData से बना देता हूं, हालांकि मेरा एकमात्र विकल्प initWithData:encoding: है जहां मुझे स्पष्ट रूप से एन्कोडिंग पास करना है। जब मैं फ़ाइलों के बजाय NSData के साथ काम करता हूं तो मैं एन्कोडिंग का भरोसेमंद अनुमान कैसे लगा सकता हूं?

उत्तर

12

सामान्य रूप से, आप नहीं कर सकते। हालांकि, आप यूटीएफ -8 फाइलों की काफी भरोसेमंद पहचान कर सकते हैं - यदि कोई फ़ाइल वैध यूटीएफ -8 है, तो यह संभव नहीं है कि यह किसी अन्य एन्कोडिंग के रूप में माना जाता है (सिवाय इसके कि सभी बाइट ASCII रेंज में हैं, इस मामले में कोई भी " विस्तारित ASCII "यूटीएफ -8 समेत एन्कोडिंग, आपको एक ही परिणाम देगा)। सभी यूनिकोड एन्कोडिंग में वैकल्पिक BOM भी है जो उन्हें पहचानता है। तो एक उचित दृष्टिकोण होगा:

  • मान्य बीओएम की तलाश करें। यदि कोई है, तो उपयुक्त एन्कोडिंग का उपयोग करें।
  • अन्यथा, इसे यूटीएफ -8 के रूप में समझने का प्रयास करें। आप इसे initWithData:data encoding:NSUTF8StringEncoding पर कॉल करके और यह जांच कर सकते हैं कि परिणाम नॉन-शून्य है या नहीं।
  • यदि यह विफल हो जाता है, तो डिफ़ॉल्ट 8-बिट एन्कोडिंग का उपयोग करें, जैसे कि -[NSString defaultCStringEncoding] (जो लोकेल-उपयुक्त अनुमान प्रदान करता है)।

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

संक्षेप में, सभी उपलब्ध एन्कोडिंग को संभालने में सक्षम होने के लिए आपको टेक्स्ट एडिट करने की आवश्यकता है: उपयोगकर्ता को निर्णय दें।

ओह, एक और बात: 10.5 के रूप में, एन्कोडिंग अक्सर अनियंत्रित com.apple.TextEncoding विस्तारित विशेषता में फ़ाइल के साथ संग्रहीत होती है। यदि आप +[NSString stringWithContentsOfFile:] या इसी तरह के साथ फ़ाइल खोलते हैं, तो यह मौजूद होने पर स्वचालित रूप से उपयोग किया जाएगा।

23

iOS 8 और ओएस एक्स 10.10 में वहाँ है NSString पर एक नया एपीआई:

ऑब्जेक्टिव-सी

+ (NSStringEncoding)stringEncodingForData:(NSData *)data 
          encodingOptions:(NSDictionary *)opts 
          convertedString:(NSString **)string 
         usedLossyConversion:(BOOL *)usedLossyConversion; 

स्विफ्ट

open class func stringEncoding(for data: Data, 
        encodingOptions opts: [StringEncodingDetectionOptionsKey : Any]? = nil, 
       convertedString string: AutoreleasingUnsafeMutablePointer<NSString?>?, 
        usedLossyConversion: UnsafeMutablePointer<ObjCBool>?) -> UInt 

अब आप कर सकते हैं ढांचा अनुमान लगाता है और मेरे अनुभव में वास्तव में अच्छा काम करता है!

हैडर से (प्रलेखन पल में विधि नहीं बताता है, लेकिन यह आधिकारिक तौर पर WWDC Session 204 (page 270) में उल्लेख किया गया था:

  1. सुझाव दिया स्ट्रिंग एन्कोडिंग की एक सरणी (इस सूची में 3 विकल्प निर्दिष्ट किए बिना, सभी स्ट्रिंग एन्कोडिंग पर विचार किया जाता है लेकिन सरणी में वाले लोगों की उच्च वरीयता होगी; इसके अलावा, सरणी में एन्कोडिंग का क्रम महत्वपूर्ण है: पहले एन्कोडिंग में सरणी में दूसरे की तुलना में अधिक प्राथमिकता है)
  2. एक सरणी स्ट्रिंग एन्कोडिंग का उपयोग न करें (इस सूची में स्ट्रिंग एन्कोडिंग सी नहीं होगी onsidered सभी)
  3. एक बूलियन यह बताते हैं कि केवल सुझाव दिया स्ट्रिंग एन्कोडिंग
  4. एक बूलियन का संकेत हानिपूर्ण की अनुमति है या विकल्प माना जाता विकल्प
  5. एक विकल्प है कि रहस्य के लिए substitude के लिए एक विशिष्ट स्ट्रिंग देता बाइट्स
  6. वर्तमान उपयोगकर्ता की भाषा
  7. एक बूलियन विकल्प का संकेत डेटा, विंडोज

द्वारा उत्पन्न होता है कि क्या अगर शब्दकोश में मूल्यों गलत प्रकार (उदाहरण के लिए है एनएसएस का मूल्य tringEncodingDetectionS सुझायाEncodingsKey एक सरणी नहीं है), एक अपवाद फेंक दिया जाता है।

यदि शब्दकोश में मान अज्ञात हैं (उदाहरण के लिए, सुझाए गए स्ट्रिंग एन्कोडिंग की सरणी में मान मान्य एन्कोडिंग नहीं है), मानों को अनदेखा कर दिया जाएगा।

उदाहरण (स्विफ्ट):

var convertedString: NSString? 
let encoding = NSString.stringEncoding(for: data, encodingOptions: nil, convertedString: &convertedString, usedLossyConversion: nil) 

तुम सिर्फ डीकोड स्ट्रिंग चाहते हैं और एन्कोडिंग के बारे में परवाह नहीं है, तो आप let encoding =

+0

निकाल सकते हैं लगता है कि वहाँ एक कारण नहीं है की तरह क्यों यह है आधिकारिक अभी तक नहीं। मैंने इसे पीडीएफ एनएसडाटा एन्कोडिंग के साथ वापस कर दिया है -2147482362। – FireDragonMule

+0

मुझे पूरा यकीन नहीं है कि अगर यह काम करने का इरादा है। एक पीडीएफ एक स्ट्रिंग नहीं है और इस विधि को 'NSData' से तारों के लिए एन्कोडिंग मिलती है। आपका इरादा क्या है? – HAS

+0

मैं एनएसडीटा के रूप में एक एसडीके के माध्यम से एक पीडीएफ पुनर्प्राप्त कर रहा हूं। मुझे अभी वेबपेज में इसे प्रदर्शित करने में समस्याएं आ रही हैं क्योंकि मुझे नहीं पता कि एन्कोडिंग क्या है या यदि कोई एन्कोडिंग भी है। – FireDragonMule

संबंधित मुद्दे