检测到不正确的NSStringEncoding值0x0000(使用ASIHTTPRequest)

时间:2011-11-15 13:17:22

标签: iphone asihttprequest

我在我的应用程序中使用ASIHTTPRequst并且遇到了一些问题,但仅限于某些设备。在某些情况下,我收到以下错误:

”  检测到不正确的NSStringEncoding值0x0000。假设NSASCIIStringEncoding。将在不久的将来停止这种兼容性映射行为 “

我的测试选项有限,因为它适用于我的所有内部测试设备,但问题仍然发生在我的一个或多个客户端测试手机上。这也可能是手机连接到蜂窝网络的情况,因为它似乎正在使用wifi。

有谁知道可能导致问题的原因?我看到有类似的问题类型,但我的代码看起来都是正确的,从其他问题答案和ASIHTTPRequest网站。

修改的 发生错误时,不会收到服务器的响应,因此用户卡在注册/登录状态。

urlEncodeValue:

- (NSString *)urlEncodeValue:(NSString *)str
{
    NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
    return [result autorelease];
}

ASIHTTPRequest代码段:

    NSString *encodedUrlAdress = [NSString stringWithFormat:@"%@user/register/%@/%@/%@/%d/%@/%@/%@/%@", 
                                   kUserServerAddress, 
                                   [self urlEncodeValue:_firstName], 
                                   [self urlEncodeValue:_lastName], 
                                   [self urlEncodeValue:_phoneNumber], 
                                   _sex, 
                                   [self urlEncodeValue:_birthDate], 
                                   [self urlEncodeValue:_address], 
                                   [self urlEncodeValue:_postalNumber]];    
    NSLog(@"encodedUrlAdress: %@", encodedUrlAdress);

    NSURL *url = [NSURL URLWithString:encodedUrlAdress];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request startSynchronous];
    NSError *error = [request error];

    if (!error) {
// do stuff
}

1 个答案:

答案 0 :(得分:15)

https://stackoverflow.com/q/8251175/918764复制我的回答 - 您最有可能收到此消息,因为您正在针对失败的请求呼叫getResponseString。你应该确保在调用之前检查是否有响应:我发现测试总请求失败的一种方法(即网络/服务器关闭)是检查:

if (request.responseStatusCode == 0) {
    // the request failed entirely
} else {
    // you at least got a HTTP response
}

如果在返回有效响应并且已设置请求编码(即无法连接到服务器)之前调用[asiHttpRequest getResponseString],则会发生这种情况。

解决此警告的最简单方法是编辑ASIHTTPRequest类,删除@synthesize responseEncoding并添加一个简单的自定义getter / setter,以便在响应编码不是时返回默认编码设置:

- (NSStringEncoding) responseEncoding
{
    return responseEncoding || self.defaultResponseEncoding;
}

- (void) setResponseEncoding:(NSStringEncoding)_responseEncoding
{
    responseEncoding = _responseEncoding;
}

getResponseString方法还有一个更具体的解决方法,我认为这是唯一一个使用编码而不检查值的地方 - 因为编码应该设置为任何非零长度响应:< / p>

- (NSString *)responseString
{
    NSData *data = [self responseData];
    if (!data) {
        return nil;
    }
    // --- INSERT THIS BLOCK ---
    // If the 'data' is present but empty, return a simple empty string
    if (data.length == 0) {
        return @"";
    }
    //assert(self.responseEncoding); // if you're into runtime asserts, uncomment this
    // --- END OF BLOCK TO INSERT ---
    return [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:[self responseEncoding]] autorelease];
}