2015-02-04 3 views
2

data을 무시아이폰 OS 목적-C을 NSData있는 NSString 반환 전무로, 어떻게 잘못된 UTF-8

NSString * html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

htmlnil이며, 웹 사이트에서 다운로드되어 있지만,

NSString * html = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 

콘텐츠를해야합니다 . 웹 사이트에 중국어 문자가 포함되어 있으므로 Ascii를 사용하면 중국어를 표시 할 수 없습니다. 웹 사이트에 잘못된 UTF-8이 있기 때문에 첫 번째 코드가 제대로 작동하지 않을 것입니다.

UTF-8을 계속 사용하면서 일부 잘못된 오류를 무시할 수있는 방법이 있습니까?

+0

그것은 당신의 데이터가 UTF-8 형식으로 다운로드되지 않은 가능성이 높습니다. –

+0

웹 사이트 (http://lib.cityu.edu.hk/search~S8/?searchtype=X&searcharg=d& & searchscope = 8 & SORT = D & extended = 0 & SUBMIT = Search)를 열고 사파리에서 인코딩을 확인하면 UTF- 8, 중국어 문자가 정상적으로 표시됩니다. – xhg

답변

4

해결책을 찾은 것 같습니다.

Vincent Guerci's answer

프로젝트에

추가 libiconv하고 잘못된 UTF-8, 청소 후에을 NSData가 [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

세부 구현에 전달하는 것이 안전입니다 청소하자

  1. 추가 "Link With Binary With Libraries"의 "libiconv.2.dylib"를 대상에 추가하십시오.
  2. #include "iconv.h"
  3. 이 기능을 추가 :

목적 C :

- (NSData *)cleanUTF8:(NSData *)data { 
    // this function is from 
    // https://stackoverflow.com/questions/3485190/nsstring-initwithdata-returns-null 
    // 
    // 
    iconv_t cd = iconv_open("UTF-8", "UTF-8"); // convert to UTF-8 from UTF-8 
    int one = 1; 
    iconvctl(cd, ICONV_SET_DISCARD_ILSEQ, &one); // discard invalid characters 
    size_t inbytesleft, outbytesleft; 
    inbytesleft = outbytesleft = data.length; 
    char *inbuf = (char *)data.bytes; 
    char *outbuf = malloc(sizeof(char) * data.length); 
    char *outptr = outbuf; 
    if (iconv(cd, &inbuf, &inbytesleft, &outptr, &outbytesleft) 
     == (size_t)-1) { 
     NSLog(@"this should not happen, seriously"); 
     return nil; 
    } 
    NSData *result = [NSData dataWithBytes:outbuf length:data.length - outbytesleft]; 
    iconv_close(cd); 
    free(outbuf); 
    return result; 
}