试图解析未知编码的POST响应

时间:2017-10-05 15:58:18

标签: ios objective-c post encoding

我正在尝试使用以下内容解析来自帖子请求的响应:

// PERFORM REQUEST
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    // GET RESPONSE STRING
    responseStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];

    // SIGNAL DONE
    dispatch_semaphore_signal(sema);

}];

我遇到了À È Ì Ò Ù等特殊字符回答错误的问题。有没有办法确定数据的正确编码?或者使用可以正确解释这些字符的内容解码数据?

2 个答案:

答案 0 :(得分:1)

如果你有变音符号,那么NSASCIIStringEncoding绝对是错误的编码,因为这意味着原始的7位ASCII,并且对于值> gt的任何字节都将失败。 127。

没有通用的方法来确定文本的编码。根据您下载的数据,可能会有启发式。例如。如果您知道包含国际字符的所有响应中包含的字符串,则可以将该字节序列与各种编码中的字节序列进行比较。或者,有些库包含有关某些字节序列频率的统计信息,以检测文本的语言和编码,但这些文件可能会猜错。

您已经在评论中说过,没有标题表示编码,这将是一种替代解决方案。

除此之外,您只能查看您正在与之交谈的任何服务器的规范,并对其中的编码进行硬编码。或者如果没有,请尝试不同的编码,直到有效。

这些天最常见的编码是UTF8和Windows Latin 1.如果你很久以后就无法分辨(例如解析JSON响应),我建议使用编码,其中任何值都是0 ... 255是有效的(如Windows拉丁语或非有损ASCII),检查数据后再次转换。

答案 1 :(得分:0)

我能够通过使用以下方法来检测数据的编码来解决问题:

// FIND ENCODING
NSStringEncoding encoding = [NSString stringEncodingForData:chunk encodingOptions:nil convertedString:nil usedLossyConversion:0];

为了提高它的准确性,我将数据分成几个块并单独解码每个块。用于执行此操作的代码如下:

// PERFORM REQUEST
NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {

    // INIT
    responseStr = @"";
    NSUInteger length = [data length];
    NSUInteger chunkSize = 100;
    NSUInteger offset = 0;

    do {

        // GET CHUNK
        NSUInteger thisChunkSize = length - offset > chunkSize ? chunkSize : length - offset;
        NSData* chunk = [NSData dataWithBytesNoCopy:(char *)[data bytes] + offset
                                             length:thisChunkSize  freeWhenDone:NO];

        // SET OFFSET
        offset += thisChunkSize;

        // FIND ENCODING
        NSStringEncoding encoding = [NSString stringEncodingForData:chunk encodingOptions:nil convertedString:nil usedLossyConversion:0];

        // GET RESPONSE STRING
        NSString *chunkString = [[NSString alloc] initWithData:chunk encoding:encoding];

        // APPEND TO RESPONSE
        responseStr = [responseStr stringByAppendingString:chunkString];

    } while (offset < length);

    // SIGNAL DONE
    dispatch_semaphore_signal(sema);

}];