重新编码NSString将返回null

时间:2010-10-05 09:42:46

标签: cocoa encoding nsstring

所以我有这段代码:

if ([receivedPage hasPrefix:[NSString stringWithUTF8String:"\xC3\xAF\xC2\xBB\xC2\xBF"]]) // UTF-8 BOM 'EF BB BF' as UTF-16 chars
    {
        //DebugLog(@"converting calls list to UTF8");
        receivedPage = [[[NSString alloc] initWithData:[receivedPage dataUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding] autorelease];
    }

但是,有时当if为true时,receivedPage变为null。为什么会发生这种情况?

收到的页面是此函数的返回值:

 NSURLResponse * response;
    NSData * result = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:error];

    if ([result length] > 0)
        return [[[NSString alloc] initWithBytes: (const void*)[result bytes] length:[result length] encoding: encoding] autorelease];
    else
    {
        if (error && *error)
            DebugLog(@"URL request got error: %@",*error);
        return nil;
    }

这里的编码是NSISOLatin1StringEncoding(不知道为什么,我正在调试其他人的代码)。

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:0)

看起来您正在尝试将字符串(包含字符的对象)视为数据(包含字节的对象)。保留从连接收到的数据,并检查其中的UTF-8 BOM(正确的三字节版本),然后根据您是否找到它来使用NSUTF8StringEncodingNSISOLatin1StringEncoding。 / p>

或者,只要有条件地使用UTF-8,如果你也可以修复服务器那样做。

此外,您应该切换此代码以异步使用NSURLConnection。如果用户的互联网连接速度很慢,那么您就是在这里悬挂应用。以异步方式执行此操作可让您保持UI运行,并在适当时显示进度,并允许用户取消。