首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测到不正确的NSStringEncoding值0x0000 (使用ASIHTTPRequest)

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

Stack Overflow用户
提问于 2011-11-15 13:17:22
回答 1查看 11.7K关注 0票数 13

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

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

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

有人知道是什么导致了这个问题吗?我看到了类似的问题类型,但是我的代码看起来与其他问题答案和ASIHTTPRequest站点一样正确。

当错误发生时编辑,没有收到来自服务器的响应,因此用户被卡在寄存器/登录。

urlEncodeValue:

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

ASIHTTPRequest代码片段:

代码语言:javascript
复制
    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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-24 01:23:21

https://stackoverflow.com/q/8251175/918764复制我的答案--您很可能会收到这条消息,因为您在请求失败时调用了getResponseString。您应该确保在调用之前检查是否得到了响应:我发现测试总请求失败(即网络/服务器故障)的一种方法是检查:

代码语言:javascript
复制
if (request.responseStatusCode == 0) {
    // the request failed entirely
} else {
    // you at least got a HTTP response
}

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

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

代码语言:javascript
复制
- (NSStringEncoding) responseEncoding
{
    return responseEncoding || self.defaultResponseEncoding;
}

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

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

代码语言:javascript
复制
- (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];
}
票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8136925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档