2009-11-03 6 views
9

HTML 및 URL (Objective-C를 사용하여 Xcode에서)을 인코딩/디코딩하는 방법입니까?URL 인코딩 및 HTML 인코딩 NSStrings

[NSString stringWithContentsOfFile:<#(NSString *)path#> encoding:<#(NSStringEncoding)enc#> error:<#(NSError **)error#>] 

예상대로 작동하지 않는 것 같습니다. "<"과 같은 특수 문자를 이와 동일한 HTML 엔터티 (예 : "<")로 변환 할 것입니다. 기대에

HTML URL Encoding Reference

HTML Entities Reference

하라구요 :

여기 (일반)이 주제에 관한 w3school 링크에 대한 레퍼런스이다.

답변

19

수신자를 올바른 URL 문자열로 변환하는 데 필요한 비율 이스케이프를 결정하기 위해 주어진 인코딩을 사용하여 수신기의 표현을 반환합니다.

- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding 

및 모든 퍼센트는 주어진 인코딩에 의해 결정된 매칭 문자 탈출 수신기로 대체하여 만든 새로운 문자열을 반환.

- (NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)encoding 
+1

문자열을 XML로 인용하는 방법에 대한 다른 답변 (예 : 엔티티 대체 및 <<) –

11

인용 방법은 주어진 문자 인코딩 (예 : UTF-8 또는 ASCII)을 사용하여 디스크에서 파일을 읽습니다. URL 또는 HTML 이스케이프와 아무 관련이 없습니다.

[myString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 

그것이 탈출 무엇 혼자 잎 대해 특정 미묘한 있기 때문에 당신이이 방법에 대한 설명서를 참조하십시오 : 당신이 URL 퍼센트 이스케이프를 추가하려면

, 당신은이 방법을 원한다. 경우에 따라 더 복잡하지만 더 유연한 CFURLCreateStringByAddingPercentEscapes()을 사용해야 할 수도 있습니다. 기본 사항을 처리하기 위해

내가 탈출 XML/HTML 스타일 개체를 할 알고 그 내장은 어디에도 없습니다. (당신이 할 경우, 당신은 그 반대의 경우도 마찬가지 NSString *CFStringRef 캐스트 할 수 있습니다)하지만,이 기능은 해야지 :

NSString * convertToXMLEntities(NSString * myString) { 
    NSMutableString * temp = [myString mutableCopy]; 

    [temp replaceOccurrencesOfString:@"&" 
          withString:@"&amp;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@"<" 
          withString:@"&lt;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@">" 
          withString:@"&gt;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@"\"" 
          withString:@"&quot;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@"'" 
          withString:@"&apos;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 

    return [temp autorelease]; 
} 
+8

와우, 코드가 공식적인 프랑스 정원처럼 보입니다. –

+1

내 코드에이 코드를 작성했다면 실제로 NSMutableString의 category에 -replaceOccurrencesOfString : withString : 메서드를 정의하고 반복을 피하기 위해이 코드를 사용했습니다. (아마도 함수 대신 NSMutableString 메서드로 이것을 작성했을 것입니다.) 그러나 나는 이것을 너무 많이 포함하고 싶지 않았습니다. –

+0

CocoaFu의 답변을 확인하십시오. 맞습니다. –

3

는 HTML/XML 엔티티 인코딩을 수행하려면, 당신은 CFMutableString 기능을 사용할 수 있습니다 true로 CFStringTransform의 마지막 매개 변수를 설정하여

NSString *result = .....;
CFStringTransform((CFMutableStringRef)result, NULL, kCFStringTransformToXMLHex, false);

을, 그것을 디코딩을 위해 일한다 (16 진수) 엔티티도 포함합니다.

3

HTML 엔티티 인코딩/디코딩에 대한 사용 CFStringTransform는 :

CFStringTransform((CFTypeRef)yourMutableString, NULL, CFSTR("Any-Hex/XML"), FALSE);

당신은 "모든-진수/XML을"변환 ICU를 사용해야합니다. kCFStringTransformToXMLHex은 충분히 공격적이지 않습니다.

+0

kCFStringTransformToXMLHex에서 누락 된 엔터티의 종류는 무엇입니까? –

+1

@StevenKramer 예를 들어> 또는 &. – fzwo