2009-11-03 4 views
11

मैं आईफोन के लिए एक एप्लीकेशन विकसित कर रहा हूं जिसमें ऐप-मेल भेजने की क्षमता है। अब तक इतना अच्छा है, लेकिन अब मैं एचटीएमएल इंजेक्शन से बचना चाहता हूं क्योंकि मेल के कुछ हिस्सों उपयोगकर्ता द्वारा उत्पन्न ग्रंथ हैं।एचटीएमएल एंट्री एन्कोडिंग ('<' से '<' में कनवर्ट करें- आईफोन पर उद्देश्य-सी

असल में मैं कुछ इस तरह के लिए खोज:

// inits 
NSString *sourceString = [NSString stringWithString:@"Hello world! Grüße dich Welt <-- This is in German."]; 

//           ----- THAT'S WHAT I'M LOOKING FOR 
// pseudo-code        | 
//           V 
NSString *htmlEncodedString = [sourceString htmlEncode]; 

// log 
NSLog(@"source string: %@", sourceString); 
NSLog(@"encoded string: %@", htmlEncodedString); 

अपेक्षित उत्पादन
source string: Hello world! Grüße dich Welt <-- This is in German.
encoded string: Hello world! Gr&#252;&#223;e dich Welt &lt;-- This is in German.

मैं पहले से ही googled और एसओ के सवाल और जवाब के कई के माध्यम से देखा, लेकिन वे सभी यूआरएल-एन्कोड से संबंधित प्रतीत होते हैं आईएनजी और यह वास्तव में मेरी ज़रूरत नहीं है (मैंने stringByAddingPercentEscapesUsingEncoding को बिना किसी किस्मत के प्रयास किया - यह% C3% BC को 'ü' से बाहर बनाता है जो ü होना चाहिए)।

एक कोड नमूना वास्तव में बहुत अच्छा होगा (मेरा सही करने?) ...

-
अग्रिम धन्यवाद,
मार्कस

उत्तर

17

मेरा NSString category for HTML देखें।

- (NSString *)stringByConvertingHTMLToPlainText; 
- (NSString *)stringByDecodingHTMLEntities; 
- (NSString *)stringByEncodingHTMLEntities; 
- (NSString *)stringWithNewLinesAsBRs; 
- (NSString *)stringByRemovingNewLinesAndWhitespace; 
+3

पर तर्क देने की आवश्यकता नहीं होगी क्या इसे एआरसी के साथ काम करने का कोई तरीका है? –

+0

इसे एआरसी के साथ काम करने के लिए, यहां जांचें: http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project बस जोड़ें NSString श्रेणी के संकलन स्रोतों के लिए ध्वज "-फनो-ओबीजेसी-आर्क"। –

0

ईमेल के वर्ण एन्कोडिंग यूनिकोड मान लिया जाये कि समर्थन करता है - UTF कहना -8 - क्या आप <, >, और &&lt, &gt, और &amp; के साथ होने वाली घटनाओं को ढूंढ और प्रतिस्थापित नहीं कर सकते?

+0

आपके उत्तर के लिए धन्यवाद। असल में आप सही हैं, लेकिन यूआरएल एन्कोड करने के लिए एक फ़ंक्शन है (stringByAddingPercentEscapesUsingEncoding) मुझे आश्चर्य हुआ कि HTML वर्ण एन्कोडिंग के लिए कोई समान नहीं है।अगर मैं इस तरह के _problem_ और यहां तक ​​कि अजनबी के साथ पहला व्यक्ति था, तो मुझे यह अजीब लगेगा कि ऐसा करने का "सही" तरीका पहिया को फिर से शुरू करने के अलावा नहीं है। – Markus

+0

नहीं, ऐसा कोई अंतर्निहित फ़ंक्शन नहीं है। टीएबीओटी द्वारा सुझाए गए अनुसार प्रतिस्थापित करने के लिए आप एनएसएसकेनर का उपयोग कर सकते हैं; यहां एक ऐसा दृष्टिकोण है जो पूरी तरह से HTML टैग को स्ट्रिप करता है, आप इसे संशोधित कर सकते हैं: http://sugarmaplesoftware.com/25/strip-html-tags/ – Pascal

+0

उत्तर और लिंक के लिए बहुत बहुत धन्यवाद! – Markus

10

धन्यवाद @all। मैं अपने स्वयं के कार्यान्वयन का उपयोग कर समाप्त हुआ:

// 
// _________________________________________ 
// 
// textToHtml 
// _________________________________________ 
// 
- (NSString*)textToHtml:(NSString*)htmlString { 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"&" withString:@"&amp;"]; 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"<" withString:@"&lt;"]; 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@">" withString:@"&gt;"]; 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"""" withString:@"&quot;"];  
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"'" withString:@"&#039;"]; 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"\n" withString:@"<br>"]; 
    return htmlString; 
} 
+2

बस एक साइड नोट: चूंकि आप
के साथ \ n को प्रतिस्थापित कर रहे हैं कि आपको अपने फ़ंक्शन को अलग-अलग नाम देना चाहिए (उदाहरण के लिए टेक्स्ट टीओएचटीएमएल)। नाम से बचने वाला HTML अन्य डेवलपर्स को इंगित करेगा कि आप केवल भाग रहे हैं (जो आप नहीं हैं) और अगर कोई इस फ़ंक्शन का पुन: उपयोग करने का प्रयास करता है तो यह अंततः बग का कारण बन जाएगा ... –

+0

अच्छा बिंदु। तदनुसार कोड स्निपेट को अपडेट किया गया। धन्यवाद! – Markus

+0

क्या आप वहां एनएसएसआरटींग का गुच्छा नहीं ले रहे हैं? –

1

मैं एक ऐसी ही समाधान की तलाश में गया है और इस

NSString* value = @"<&>"; 
const void* keys[1] = {CFSTR("somekey")}; 
const void* values[1] = {value};  
CFDictionaryRef dicRef = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 1, nil, nil);  
CFDataRef dataRef = CFPropertyListCreateData(kCFAllocatorDefault, dicRef, kCFPropertyListXMLFormat_v1_0, 0, NULL);  
NSString *str = [[NSString alloc]initWithData:(NSData *)dataRef encoding:NSUTF8StringEncoding];  
NSRange start =[str rangeOfString:@"string>"]; 
NSRange end =[str rangeOfString:@"</string"];  
NSString *substr = [str substringWithRange:NSMakeRange(start.location+start.length, end.location-(start.location+start.length))]; 
[str release]; 
CFRelease(dicRef); 
CFRelease(dataRef);  

// सबस्ट्रिंग मेरे लिए काम किया है अब html इकाई

इनकोडिंग मैं उपयोग कर रहा हूँ: यहाँ तरीके उपलब्ध हैं प्लेस्ट फ़ाइलों को सहेजते समय उपयोग की जाने वाली कुछ विशेषताएं। आशा है कि ये आपकी मदद करेगा।

2

@Markus 'कोड पर एक छोटी सी में सुधार [बदलें < br/> < पी > </p >, से बचने के लिए कई रिक्त स्थान]

- (NSString*)textToHtml:(NSString*)htmlString { 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"&" withString:@"&amp;"]; 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"<" withString:@"&lt;"]; 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@">" withString:@"&gt;"]; 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"""" withString:@"&quot;"]; 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"'" withString:@"&#039;"]; 

    htmlString = [@"<p>" stringByAppendingString:htmlString]; 
    htmlString = [htmlString stringByAppendingString:@"</p>"]; 
    htmlString = [htmlString stringByReplacingOccurrencesOfString:@"\n" withString:@"</p><p>"]; 
// htmlString = [htmlString stringByReplacingOccurrencesOfString:@"\n" withString:@"<br />"]; 
    while ([htmlString rangeOfString:@" "].length > 0) { 
     htmlString = [htmlString stringByReplacingOccurrencesOfString:@" " withString:@"&nbsp;&nbsp;"]; 
    } 
    return htmlString; 
} 
0

मैं @Markus जवाब का विस्तार कर रहा हूँ, क्योंकि मेरी मामला है मैं JSON स्ट्रिंग भेज रहा हूं, इसलिए मुझे कुछ भागने की ज़रूरत है, ये मेरा कार्य हैं:

नोट: w3schools से अपवाद संदर्भ। https://www.w3schools.com/tags/ref_urlencode.asp

- (NSString*)convertStringToHTMLEscape:(NSString*)stringContent 
{ 
    stringContent = [stringContent stringByReplacingOccurrencesOfString:@"{" withString:@"%7B"]; 
    stringContent = [stringContent stringByReplacingOccurrencesOfString:@"}" withString:@"%7D"]; 
    stringContent = [stringContent stringByReplacingOccurrencesOfString:@"[" withString:@"%5B"]; 
    stringContent = [stringContent stringByReplacingOccurrencesOfString:@"]" withString:@"%5D"]; 
    stringContent = [stringContent stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; 
    stringContent = [stringContent stringByReplacingOccurrencesOfString:@"\"" withString:@"%22"]; 
    stringContent = [stringContent stringByReplacingOccurrencesOfString:@"\\" withString:@"%5C"]; 
    stringContent = [stringContent stringByReplacingOccurrencesOfString:@"/" withString:@"%2F"]; 

    return stringContent; 
}