2009-09-11 9 views
6

मुझे एनएसडीएटा के रूप में एक HTML फ़ाइल मिल रही है और कुछ जानकारी निकालने के लिए इसे पार्स करने की आवश्यकता है। मेरा दृष्टिकोण इसे यूटीएफ 8 एन्कोडिंग के साथ एनएसएसटींग में परिवर्तित करना था (एचटीएमएल में गैर अंग्रेजी वर्ण नहीं हैं, उदाहरण के लिए रूसी) - यह असफल रहा। मैंने ऐसा कुछ इस्तेमाल किया:NSData एनएसएसटींग कनवर्टन समस्या के लिए!

NSString *respData = [NSString stringWithUTF8String:[theData bytes]]; 

लेकिन यह शून्य हो गया।

केवल एक चीज है कि वास्तव में काम किया

[NSString stringWithCString:[theData bytes] length:[theData length]]; 

था लेकिन जब यह उदाहरण के लिए रूसी पात्रों का सामना करना पड़ता यह jibrish देता है।

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

सभी की
-(NSString *)UTF8StringFromData:(NSData *)theData{ 
Byte *arr = [theData bytes]; 
NSUInteger begin1 = [self findIndexOf:@"<li>" bArr:arr size:[theData length]]+4; 
NSUInteger end1 = [self findIndexOf:@"</li></ol>" bArr:arr size:[theData length]]; 
Byte *arr1 = (Byte *)malloc(sizeof(Byte)*((end1-begin1+1))); 
int j = 0; 
for (int i = begin1; i < end1; i++){ 
    arr1[j] = arr[i]; 
    j++; 
} 
arr1[j]='\0'; 
NSData *temp = [NSData dataWithBytes:arr1 length:j]; 
return [[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding]; 
} 
+1

आप कर रहे हैं * सुनिश्चित करें कि * उस फ़ाइल को UTF-8 के रूप में एन्कोड किया गया है, और आईएसओ 8859-5 या कुछ और के रूप में नहीं? – Wevah

उत्तर

0

पहले यहाँ मेरे कोड

-(NSString *)UTF8StringFromData:(NSData *)theData{ 
    Byte *arr = [theData bytes]; 
    NSUInteger begin1 = [self findIndexOf:@"<li>" bArr:arr size:[theData length]]+4; 
    NSUInteger end1 = [self findIndexOf:@"</li></ol>" bArr:arr size:[theData length]]; 
    Byte *arr1 = (Byte *)malloc(sizeof(Byte)*((end1-begin1+1))); 
    int j = 0; 
    for (int i = begin1; i < end1; i++){ 
     arr1[j] = arr[i]; 
     j++; 
    } 
    arr1[j]='\0'; 
    NSData *temp = [NSData dataWithBytes:arr1 length:j]; 
    return [[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding]; 
} 

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

+0

कोई नहीं जानता? ... चलो ... किसी को –

11

जाना चाहिए तुम्हें एक NSURLResponse * प्रतिक्रिया मिली और एक NSData * डेटा:

CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef) [response textEncodingName]); 
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding); 

NSString* string = [[NSString alloc] initWithData:data encoding:encoding]; 

// Do stuff here.. 

[string release]; 
+0

से पहले इस पर आना होगा, मैं अपने प्रोजेक्ट के लिए एआरसी सक्षम के साथ एक्सकोड 4 का उपयोग कर रहा हूं, और जब मैं उपर्युक्त कोड का उपयोग करता हूं तो यह शिकायत करता है कि 'उद्देश्य-सी सूचक प्रकार का कास्ट' एनएसएसटींग * 'से सी पॉइंटर प्रकार' CFStringRef '(उर्फ' कॉन्स स्ट्रक्चर __CFString * ') को एक ब्रिज कास्ट की आवश्यकता होती है। जब मैंने सुझाए गए किसी भी फिक्स को लागू किया (या तो '__bridge' या '__bridge_retained' का उपयोग करके) प्रोग्राम चलाते समय मुझे EXC_BAD_ACCESS सिग्नल मिलता है। कोई विचार? – Guss

+0

यह '(__bridge CFStringRef) होना चाहिए [प्रतिक्रिया टेक्स्ट एन्कोडिंगनाम]'। यह न तो काम मुझे इंगित करता है कि समस्या कहीं और है। NSZombieEnabled चालू करें और Deallocated स्मृति पहुंच को ट्रैक करने के लिए CFZombieLevel का उपयोग करें। –

+0

उत्तर के लिए धन्यवाद। यह अपेक्षाकृत जटिल लगता है और मैं आईओएस विकास में कुल नोब हूं, लेकिन मैं इसे देख लूंगा। अंत में मैंने भयानक कोड का उपयोग करके समस्या के आसपास काम किया: 'char * myenc = malloc ([प्रतिक्रिया एन्कोडिंग लंबाई]); [[_response textEncodingName] getCString: myenc maxLength: [प्रतिक्रिया एन्कोडिंग लंबाई] एन्कोडिंग: NSASCIIStringEncoding]; CFStringRef encenc = CFStringCreateWithCString (kCFAllocatorDefault, myenc, kCFStringEncodingASCII); CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding (encenc); मुफ्त (myenc); ' – Guss

1

मैं ऊपर, यहाँ Martijn Thé थ्रेड का उत्तर हूँ, क्योंकि मैं टिप्पणियों में एक पठनीय कोड स्निपेट नहीं डाल सका।

मुझे पता चला कि सर्वर पर, प्रतिक्रिया सामग्री प्रकार 'टेक्स्ट/सादा' पर सेट है, फिर (__bridge CFStringRef) [प्रतिक्रिया टेक्स्ट एन्कोडिंगनाम] शून्य हो जाएगा, और यदि आप इसे CFStringConvertIANACharSetNameToEncoding पर पास करने का प्रयास करेंगे तो आपको मिलेगा एक EXC_BAD_ACCESS संकेत।

यदि प्रतिक्रिया का प्रकार प्रकार टेक्स्ट/html पर सेट है; charset = utf-8 ', तो सब कुछ अपेक्षित के रूप में काम करता है। 'पाठ/सादे' सामग्री प्रकार संभाल करने के लिए, यह मैं क्या किया है:

CFStringRef sRef = (__bridge CFStringRef)[response textEncodingName]; 
if (sRef) 
{ 
     CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding(sRef); 
     encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding); 
} 
else 
{ 
     encoding = NSASCIIStringEncoding; 
}