我目前正在编写一个从PHP echo
读取数据的iOS应用程序。在逃避每个角色的麻烦后,我使用了PHP函数UTF8_Encode
。
这看起来效果很好,但是当输出中有引号("
)时,它在应用中显示为â
。
从PHP应用程序发送Feed的代码是:
echo (UTF8_encode($variable));
在iOS应用中使用此Feed的代码是:
NSString *urlString = [NSString stringWithFormat:@"thisisalink"];
NSURL *url = [NSURL URLWithString:[urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData *returnData = [NSData dataWithContentsOfURL:url];
NSString *strResult = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
答案 0 :(得分:4)
看到â
的问题源于使用卷曲引号(例如“
而不是"
),并且服务器传输的字符集编码与字符之间存在一些脱节设置由iOS应用程序处理的编码。
我无法准确地重现您的问题,但我可以通过故意滥用“x”
代替NSISOLatin1StringEncoding
来发送仅为NSUTF8StringEncoding
的回复,并通过以下方式对其进行模拟:
NSData *data = [NSData dataWithContentsOfURL:url];
NSString *string = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding]; // this won't work
NSLog(@"data = %@, string = %@", data, string);
而不是我的服务器发送的预期“x”
响应,它生成以下输出:
data = <e2809c78 e2809d>, results = âxâ
前三个字节(0xe2809c
)表示开头引号字符,0x78
表示字母x
,后三个字节(0xe2809d
)表示结束引用字符。如你所见,底线,Objective-C不知道如何做到这一点。
有几种解决方案:
从服务器的响应中删除这些扩展的unicode字符。
确保服务器响应的字符集与客户端上的解析响应的字符集匹配。
或者,您可以使用为您执行此转换的文件格式。例如,我使用了PHP json_encode
函数,它负责转换字符集:
echo json_encode(array("response" => $variable));
然后我使用以下Objective-C代码在iOS中解析它:
NSData *data = [NSData dataWithContentsOfURL:url];
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
报告JSON响应,如下所示:
{"response":"\u201cx\u201d"}
然后您可以像这样解析JSON:
NSError *error = nil;
NSDictionary *results = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
if (!error)
NSLog(@"%@", results[@"response"]);
else
NSLog(@"Unable to parse: error = %@", error);
如您最初所预期的那样,报告如下:
“x”
就个人而言,当我的服务器发送要由我的应用程序解析的数据时,我总是使用为机器到机器接口设计的格式,例如JSON或XML。这使我可以将结构化响应放在一起,更容易报告错误,解决许多文本格式问题等等。