Iphone 检测到错误的NSStringEncoding值0x0000(使用ASIHTTPRequest)

Iphone 检测到错误的NSStringEncoding值0x0000(使用ASIHTTPRequest),iphone,asihttprequest,Iphone,Asihttprequest,我在我的应用程序中使用AsiHttpRequest,我有一些问题,但只在某些设备上。在某些情况下,我会出现以下错误: " 检测到不正确的NSStringEncoding值0x0000。假定NSASCIIStringEncoding。将在不久的将来停止此兼容性映射行为 " 我有有限的选择来测试它,因为它可以在我所有的内部测试设备上工作,但问题仍然发生在我的一个或多个客户测试手机上。当手机连接到蜂窝网络时,也可能出现这种情况,因为它似乎在使用wifi 有人知道问题的原因吗?我看到有类似类型的问题,但

我在我的应用程序中使用AsiHttpRequest,我有一些问题,但只在某些设备上。在某些情况下,我会出现以下错误:

" 检测到不正确的NSStringEncoding值0x0000。假定NSASCIIStringEncoding。将在不久的将来停止此兼容性映射行为 "

我有有限的选择来测试它,因为它可以在我所有的内部测试设备上工作,但问题仍然发生在我的一个或多个客户测试手机上。当手机连接到蜂窝网络时,也可能出现这种情况,因为它似乎在使用wifi

有人知道问题的原因吗?我看到有类似类型的问题,但从其他问题的答案和ASIHTTPRequest网站上看,我的代码看起来都是正确的

编辑 当错误发生时,没有收到来自服务器的响应,因此用户无法注册/登录

urlEncodeValue:

- (NSString *)urlEncodeValue:(NSString *)str
{
    NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
    return [result autorelease];
}
    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
}
ASIHTTPRequest代码片段:

- (NSString *)urlEncodeValue:(NSString *)str
{
    NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
    return [result autorelease];
}
    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
}
从复制我的答案-您很可能收到此消息,因为您正在调用
getResponseString
,请求失败。在调用此命令之前,您应该确保检查是否收到响应:我发现测试请求总失败(即网络/服务器关闭)的一种方法是检查:

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

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

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

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

- (void) setResponseEncoding:(NSStringEncoding)_responseEncoding
{
    responseEncoding = _responseEncoding;
}
getResponseString
方法还有一个更具体的解决方法,我认为这是唯一一个使用编码而不检查值的地方,因为编码应该为任何非零长度响应设置:

- (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];
}

你应该展示你的urlEncodeValue方法的代码谢谢Tim,它包括现在就我所见这里一切看起来都很好:你有多确定问题发生在代码的这一部分?您说没有收到来自服务器的响应。您是否验证了消息是否正在发送到服务器?我已经一步一步地检查了代码,当请求在以下行超时时会出现错误消息:ASIHTTPRequest*request=[ASIHTTPRequest requestWithURL:url];编辑:但是,这只发生在我的客户的一部测试手机上,我们的手机中没有任何一部出现此问题,因此这很奇怪:\n我现在无法在手机上重现此问题扫描无法解决此问题,需要任何帮助。我有问题,当我火的每一个要求,无论是从模拟器红外设备。谢谢,这是非常有帮助的!很乐意帮忙!我们对使用的ASIHTTPRequest代码进行了一些类似的其他更改,因此我想我会很快制作一个GitHub fork,并将它们全部提交到那里,以获得更大的好处。我们最终放弃了ASIHTTPRequest,因为它在处理野外代理身份验证方面存在一些严重缺陷;直接包装NSURLRequest/NSURLConnection为我们提供了更好的性能和更大的灵活性来处理自定义SSL验证。你的里程数可能会有所不同。回答得很好。请共享GitHub fork的链接。因此,我们可以得到您更改的代码ASIHTTPRequest@AsifBilal不幸的是,当时我的老板没有澄清这一点;所以我不能分享代码。