gpt4 book ai didi

ios - 确定从 iPhone 中的 URL 检索 JSON 的问题

转载 作者:行者123 更新时间:2023-11-28 22:16:12 28 4
gpt4 key购买 nike

首先让我说,我并不是特别想找到解决方案,只是寻找问题的根本原因。我正在尝试从 url 检索 JSON。在浏览器中,url 调用工作正常,我能够毫无问题地看到整个 JSON。但是,在 x 代码中,当简单地使用 NSURLConnection 时,我正在获取数据字节,但我的 NSString 为空。

    theString = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];

经过一些研究后,我发现我可能尝试使用错误的编码。我不确定 url 使用的是哪种编码类型,所以本能地我只是尝试了一些随机编码类型。

    NSString* myString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSString* myString2 = [[NSString alloc] initWithData:data encoding:NSUTF16StringEncoding];
NSString* myString3 = [[NSString alloc] initWithData:data encoding:NSWindowsCP1252StringEncoding];

NSASCIIStringEncoding 和 NSWindowsCP1252StringEncoding 能够带回部分正确的 JSON。我无法在浏览器中查看整个 JSON,有些字符有点困惑,但它是一些东西。为了尝试更好地确定使用了什么编码,我决定使用以下方法通过查看返回的编码来尝试确定它。

NSError *error = nil;
NSStringEncoding encoding;
NSString *my_string = [[NSString alloc] initWithContentsOfURL:url
usedEncoding:&encoding
error:&error];

我的 NSStringEncoding 值为 3221214344。每次运行应用程序时,这个数字都是一致的。我找不到任何与此匹配的 NSStringEncoding 值。

我的最后一个问题是:iOS 是否无法使用用于此 url 的编码,是否有可能为此 url 使用了多种类型的编码,或者我这边是否还有其他地方可能做错了?

最佳答案

如果可能,最好不要依赖 Cocoa 来计算字符串编码,尤其是在数据可能已损坏的情况下。更好的方法是检查 HTTP Content-Type header 指示的值是否指定了一个字符集,如本例所示:

Content-Type: text/html; charset=ISO-8859-4

一旦您能够从 Content-Type header 解析和检索字符集名称,您需要将其转换为 NSStringEncoding,首先将其传递给 CFStringConvertIANACharSetNameToEncoding,然后将返回的CF字符串编码传递给CFStringConvertEncodingToNSStringEncoding。之后,您可以使用 -[NSString initWithData:encoding:] 初始化您的字符串。

NSData *HTTPResponseBody = …; // Get the HTTP response body
NSString *charSetName = …; // Get a charset name from the Content-Type HTTP header

// Get the Core Foundation string encoding
CFStringEncoding cfencoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)charSetName);

// Confirm this is a known encoding
if (cfencoding != kCFStringEncodingInvalidId) {
// Initialize the string
NSStringEncoding nsencoding = CFStringConvertEncodingToNSStringEncoding(cfencoding);
NSString *JSON = [[NSString alloc] initWithData: HTTPResponseBody
encoding: nsencoding];
}

如果您正在使用的字符串数据已损坏,您仍然可能会遇到问题。例如,在上面的代码片段中,可能 charSetName 是 UTF-8,但是 HTTPResponseBody 无法解析为 UTF-8,因为存在无效的字节序列。在这种情况下,当您尝试实例化您的字符串时,Cocoa 将返回 nil,并且没有清理数据以使其符合报告的字符串编码(可能通过去除无效字节序列),您可能想要向最终用户报告错误。

作为最后的努力——而不是报告错误——你可以使用可以处理你抛给它的任何东西的编码来初始化一个字符串,比如 NSMacOSRomanStringEncoding .这里需要注意的是,unicode/损坏的数据可能会间歇性地显示为符号或意外的字母数字。

关于ios - 确定从 iPhone 中的 URL 检索 JSON 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21607775/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com