2009-11-03 7 views
11

Zajmuję się tworzeniem aplikacji dla iPhone'a, która ma możliwości wysyłania poczty przez e-mail. Do tej pory tak dobrze, ale teraz chcę uniknąć zastrzyków html, ponieważ niektóre części wiadomości są generowane przez użytkowników.Kodowanie encji HTML (konwertuj "<" na "<") na iPhone'a w obiekty-c

Zasadniczo szukam czegoś takiego:

// 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); 

Oczekiwany wyjście
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.

już google i przejrzałem kilka pytań i odpowiedzi tak, ale wszystkie z nich wydają się być powiązane z kodowaniem adresu URL ing i to nie jest to, czego naprawdę potrzebuję (próbowałem stringByAddingPercentEscapesUsingEncoding bez powodzenia - tworzy% C3% BC z "ü", który powinien być ü).

Przykładowy kod byłoby naprawdę super (sprostowanie kopalni?) ...

-
Dzięki z góry
Markus

Odpowiedz

17

Sprawdź mój NSString category for HTML. Oto dostępne metody:

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

Czy jest jakiś sposób, aby zadziałał z ARC? –

+0

Aby to działało z ARC, sprawdź tutaj: http://stackoverflow.com/questions/6646052/how-can-i-disable-arc-for-a-single-file-in-a-project Po prostu dodaj flaga "-fno-objc-arc" do źródeł kompilacji kategorii NSString. –

0

Zakładając kodowanie znaków w wiadomości e-mail obsługuje Unicode - mówią UTF -8 - czy nie można znaleźć i zastąpić wystąpień <, > i & z &lt, &gt i &amp;?

+0

Dzięki za odpowiedź. Zasadniczo masz rację, ale ponieważ istnieje funkcja kodowania adresów URL (stringByAddingPercentEscapesUsingEncoding) zastanawiałem się, czy nie ma podobnego do kodowania znaków HTML.Byłbym dziwny, gdybym był pierwszy z tego rodzaju "problemem", a nawet dziwniejszym, gdyby nie było "właściwego" sposobu robienia tego, innego niż wymyślanie koła. – Markus

+0

Nie, nie ma takiej wbudowanej funkcji. Możesz użyć NSScannera do zastąpienia zgodnie z sugestią teabota; Oto podejście, które całkowicie usuwa znaczniki HTML, możesz je po prostu zmodyfikować: http://sugarmaplesoftware.com/25/strip-html-tags/ – Pascal

+0

Wielkie dzięki za odpowiedź i link! – Markus

10

Dzięki @all. Skończyło się na mojej własnej implementacji:

// 
// _________________________________________ 
// 
// 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

tylko jedna uwaga: ponieważ zastępujesz \ n także
, powinieneś nazwać swoją funkcję inaczej (textToHtml na przykład). Nazwa escapeHTML będzie wskazywać innym programistom, że właśnie robisz ucieczkę (której nie jesteś), a to w końcu spowoduje błędy, jeśli ktoś spróbuje ponownie użyć tej funkcji ... –

+0

Dobra rada. Właśnie zaktualizowałeś fragment kodu. Dzięki! – Markus

+0

Czy nie ma tu wycieku wielu NSStrings? –

1

czekałem na podobną rozwiązania i to nie praca dla mnie

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);  

// podciągu jest obecnie jednostka html zakodowany

używam niektóre funkcje używane podczas zapisywania plików plist. Mam nadzieję, że to pomoże.

2

Trochę ulepszeniem kodu @Markus' [Zmień < br/> do <p> </p >, ucieczka wielokrotne spacje]

- (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

mam rozszerzenie @Markus odpowiedź, ponieważ mój przypadek jest Wysyłam ciąg JSON, więc muszę dodać trochę ucieczki, oto moja funkcja:

uwaga: odwołanie do wyjątku od 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; 
} 
Powiązane problemy