我正在尝试使用以下内容解析来自帖子请求的响应:
// 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);
}];
我遇到了À
È
Ì
Ò
Ù
等特殊字符回答错误的问题。有没有办法确定数据的正确编码?或者使用可以正确解释这些字符的内容解码数据?
答案 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);
}];