服务器的引号(“)在iOS应用中显示为”â“

时间:2013-05-14 14:20:28

标签: ios encoding utf-8

我目前正在编写一个从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];

1 个答案:

答案 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不知道如何做到这一点。

有几种解决方案:

  1. 从服务器的响应中删除这些扩展的unicode字符。

  2. 确保服务器响应的字符集与客户端上的解析响应的字符集匹配。

  3. 或者,您可以使用为您执行此转换的文件格式。例如,我使用了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”
    
  4. 就个人而言,当我的服务器发送要由我的应用程序解析的数据时,我总是使用为机器到机器接口设计的格式,例如JSON或XML。这使我可以将结构化响应放在一起,更容易报告错误,解决许多文本格式问题等等。