2009-12-18 5 views
20

는 그래서 사용하여 내 아이폰의 애플 리케이션에서 PHP 스크립트에서 JSON 문자열을 가져 오는 해요 : I 출력을 테스트 할 때인코딩 문제 : Cocoa Error 261?

NSURL *baseURL = [NSURL URLWithString:@"test.php"]; 
NSError *encodeError = [[NSError alloc] init]; 
NSString *jsonString = [NSString stringWithContentsOfURL:baseURL encoding:NSUTF8StringEncoding error:&encodeError]; 
NSLog(@"Error: %@", [encodeError localizedDescription]); 
NSLog(@"STRING: %@", jsonString); 

json으로 문자열의 유효성을 검사합니다. 이제 인코딩 문제가 있습니다.

{ "testKey":"é" } 

JSON 구문 분석기가 정상적으로 작동하고 유효한 JSON 개체를 만들 수 있습니다. 그러나 2MB JSON 문자열을 가져 오면

Error: Operation could not be completed. (Cocoa error 261.) 

및 Null 문자열이 표시됩니다. 내 PHP 파일은 UTF8 자체이며 utf8_encode()를 사용하지 않습니다. 데이터를 이미 NSUTF8StringEncoding으로 가져 오기 때문에 데이터를 이중으로 인코딩 할 것입니다. 어느 쪽이든, 내 단일 에코 테스트에서는 JSON 객체를 빌드 할 때 \ ASDAS 스타일 UTF8 이스케이프를 성공적으로 기록 할 수있는 접근 방식입니다.

큰 문자열의 경우 오류의 원인은 무엇입니까?

또한 차이점이 있는지 잘 모르겠습니다 만, PHP 파싱 함수를 사용하여 addslashes()를 사용하여 구문 분석 된 PHP 데이터에 인용문 등을 설명 할 때 JSON 문자열을 작성할 때 유용합니다.

답변

19

이것이 문제가되는지 모르겠지만 비슷한 문제 (stringWithContentsOfFile, JSON 없음)가 있고 문제는 파일에 CRLF (windows) 줄 끝과 서양식이 무엇이든간에 문제가 있다는 것입니다. 소위 인코딩. SubEthaEdit을 사용하여 LF (Mac/Unix 라인 - 엔딩) 및 UTF-8 인코딩으로 변환 했으므로 모든 것이 올바르게 작동합니다.

+0

또한 파일 인코딩 유형을 검사하는 것이 유용 할 수 있습니다. 나는 이것을하기 위해 Text Wrangler를 사용했다. 파일을 열고 창 하단에 인코딩 종류가 표시됩니다. UTF16이 필요했지만 많은 변형이있었습니다. – TigerCoding

0

나중에 참조 할 수 있도록 인코딩을 재정의해야하고 내장 NUL이없는 스트림으로 작업하는 경우이 방법이 유용 할 수 있습니다 (방금 대략적인 스케치 개요를 작성하고이 코드를 확인하고

NSHTTPURLResponse* resp=nil; 
NSData* jsonAsImmutableData = [NSURLConnection sendSynchronousRequest: 
    [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://<whatever>"]] 
    returningResponse:&resp error:NULL]; 

NSMutableData*modifiedData = [NSMutableData dataWithData:jsonAsImmutableData]; 

char extraNulls[7] = 
    {0,0,0,0,0,0,0}; // is this defensive enough for your encoding? 
[modifiedData appendBytes:extraNulls length:7]; 

NSString* jsonAsString = [NSString stringWithCString:[modifiedData bytes] 
    encoding:<whatever your encoding is>]; 

을하지만 행동의 최고의 코스 서버가 모두 사용하고 UTF-8 인코딩 또는 다른 애플 아이폰 지원 인코딩을 사용하도록 주장임을 확인하는 것입니다 기대 : 당신이) 그것을 사용하기 전에 원하는 싶지 않습니다.

수정

변경 코드 주석.

+0

하거나이 추가 달성 무슨 ... 당신이 제발 조금 더 정교한 수 있을까? –

+0

아, 인코딩이 8 비트 문자가 아닌 32 비트 문자 (예 : UTF32) 인 경우 32 비트를 끝내려면 null (C 문자열을 종료하려면 stringWithCString : API 호출에서 필요함)을 추가하면됩니다. 7 NUL 문자 (완벽하게 정렬 된 경우 4 개 필요, 최악의 경우 정렬 불필요 3 개 필요) 단지 ASCII 8 비트 인코딩 인 경우 1 NUL 바이트로 충분하지만 사용중인 인코딩을 모르기 때문에 추가로 붙어 있습니다. – martinr

+0

물론 나는 높은 비트 클리어 (8 비트 바이트에서 7 비트 코드)를 가진 US ASCII를 의미합니다. 그리고 UTF32조차도 얼마나 많은 Null 바이트가 실제로 필요한지 잘 모르겠습니다. 나는 당신에게 그러한 검사를 넘겨주고 당신의 (특별한) 부호화를 확인합니다. 고맙습니다..! – martinr

27

[NSString stringWithContentsOfFile : encoding : error :]를 호출 할 때 NSUTF8StringEncoding 대신 다른 인코딩 값을 사용한다고 언급 한 사람은 놀랍습니다.

또한 JSON 파일을 구문 분석 할 때 코코아 오류 261이 발생했습니다. 한 번 작업 할 때까지 NSString encodings의 목록을 살펴 보았습니다. 다행히도 첫 번째 작품은 저에게 효과적이었습니다. NSASCIIStringEncoding!

NSString stringWithContentsOfFile:usedEncoding:error:을 사용하여 올바른 인코딩 (여기에 설명 된대로 : How to use stringWithContentsOfURL:encoding:error:?)을 찾을 수도 있습니다.

+0

그건 완전히 내 문제 였어. 허용 된 대답에 문제가있어 입력 파일을 변경할 수 없다는 것입니다. –

+0

입력 파일을 변경하지 못할 수도 있습니다. 내 요점은 : 문제는 json (또는 PHP)에 관한 것이 아니라 문자열 인코딩에 관한 것입니다. 파일을 변경했지만 NS 인코딩 값도 변경할 수 있습니다. – Olie

0

실제 파일 인코딩을 UTF-8로 변경하는 데 도움이 된 것은 무엇입니까? 편집인은 MacRoman을 기본값으로 설정했으며 악센트가있는 글자를 좋아하지 않았습니다.

5

인코딩 문제 : Cocoa Error 261? 다른 인코딩을 시도하여이 문제를 해결했습니다. 먼저 NSUTF8을 사용하고 나서 을 NSASCIIStringEncoding으로 전환했고을 사용했습니다.나는 당신이 충분히 방어가 무슨 뜻인지 이해가 아주 확실하지 않다

NSString* path = [[NSBundle mainBundle] pathForResource: @"fileName" ofType: @"type"]; 
NSData* data = [NSData dataWithContentsOfFile:path]; 
NSString *string = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
NSLog(@"%@",string); 
+0

파일의 내용이 바뀌고 있습니다. – chaaruu