所以我使用以下方法从我的iPhone应用程序中的php脚本中获取JSON字符串:
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字符串在测试输出时验证。现在我遇到了编码问题。当我获取单个echo'd行时,例如:
{ "testKey":"é" }
JSON解析器工作正常,我能够创建一个有效的JSON对象。但是,当我获取2MB JSON字符串时,我会看到:
Error: Operation could not be completed. (Cocoa error 261.)
和一个空字符串。我的PHP文件本身是UTF8,我没有使用utf8_encode(),因为这似乎是对数据进行双重编码,因为我已经将数据拉为NSUTF8StringEncoding。无论哪种方式,在我的单回显测试中,这是允许我在构建JSON对象时成功记录\ ASDAS样式UTF8转义的方法。
在较大字符串的情况下,可能导致错误的原因是什么?
另外,我不确定它是否有所作为,但是我在我解析的php数据上使用php函数addslashes()来计算引号等等。在构建JSON字符串时。
答案 0 :(得分:27)
我很惊讶没有人提到在调用[NSString stringWithContentsOfFile:encoding:error:]时使用不同的编码值而不是NSUTF8StringEncoding。
在解析JSON文件时,我也得到了Cocoa错误261。我刚刚查看NSString encodings列表,直到有人工作。幸运的是,第一个为我工作:NSASCIIStringEncoding!
您还可以使用NSString stringWithContentsOfFile:usedEncoding:error:尝试查找正确的编码(如下所述:How to use stringWithContentsOfURL:encoding:error:?)。
答案 1 :(得分:19)
不知道这是不是你的问题,但我只是有一个类似的东西(stringWithContentsOfFile,没有JSON),问题是该文件有CRLF(windows)行结尾和西方 - 无论它叫什么编码。我使用SubEthaEdit转换为LF(Mac / Unix行结束)和UTF-8编码,现在一切正常。
答案 2 :(得分: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);
答案 3 :(得分: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编码或其他Apple iPhone支持的编码。
修改
修改了代码注释。
答案 4 :(得分:0)
帮助我的只是将物理文件编码更改为UTF-8。我的编辑器已将其设置为默认值MacRoman,并且不喜欢带重音的字母。