所以我有这段代码:
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(不知道为什么,我正在调试其他人的代码)。
知道为什么会这样吗?
答案 0 :(得分:0)
看起来您正在尝试将字符串(包含字符的对象)视为数据(包含字节的对象)。保留从连接收到的数据,并检查其中的UTF-8 BOM(正确的三字节版本),然后根据您是否找到它来使用NSUTF8StringEncoding
或NSISOLatin1StringEncoding
。 / p>
或者,只要有条件地使用UTF-8,如果你也可以修复服务器那样做。
此外,您应该切换此代码以异步使用NSURLConnection。如果用户的互联网连接速度很慢,那么您就是在这里悬挂应用。以异步方式执行此操作可让您保持UI运行,并在适当时显示进度,并允许用户取消。