我正在获取一个html文件作为NSData,需要解析它以提取一些信息。我的方法是使用UTF8编码将其转换为NSString(html具有非英文字符,例如俄语) - 它失败了。我用过类似的东西:
NSString *respData = [NSString stringWithUTF8String:[theData bytes]];
但它返回零。
实际上唯一有效的是
[NSString stringWithCString:[theData bytes] length:[theData length]];
但是当遇到俄语字符时,它会返回jibrish。
然后我的下一个方法是解析数据的字节数组,提取我需要的字节并以某种方式将它们转换为NSString。我尝试过类似的东西:
-(NSString *)UTF8StringFromData:(NSData *)theData{
Byte *arr = [theData bytes];
NSUInteger begin1 = [self findIndexOf:@"<li>" bArr:arr size:[theData length]]+4;
NSUInteger end1 = [self findIndexOf:@"</li></ol>" bArr:arr size:[theData length]];
Byte *arr1 = (Byte *)malloc(sizeof(Byte)*((end1-begin1+1)));
int j = 0;
for (int i = begin1; i < end1; i++){
arr1[j] = arr[i];
j++;
}
arr1[j]='\0';
NSData *temp = [NSData dataWithBytes:arr1 length:j];
return [[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding];
}
答案 0 :(得分:11)
假设您有NSURLResponse *响应和NSData *数据:
CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef) [response textEncodingName]);
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
NSString* string = [[NSString alloc] initWithData:data encoding:encoding];
// Do stuff here..
[string release];
答案 1 :(得分:1)
我正在回复上面的MartijnThé主题,因为我无法在评论中添加可读的代码段。
我发现如果在服务器上,响应内容类型设置为'text / plain',那么(__bridge CFStringRef)[response textEncodingName]将为null,如果你尝试将它传递给CFStringConvertIANACharSetNameToEncoding,你会得到一个EXC_BAD_ACCESS信号。
如果响应的内容类型设置为'text / html; charset = utf-8',然后一切都按预期工作。要处理'text / plain'内容类型,我就是这样做的:
CFStringRef sRef = (__bridge CFStringRef)[response textEncodingName];
if (sRef)
{
CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding(sRef);
encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
}
else
{
encoding = NSASCIIStringEncoding;
}
答案 2 :(得分:0)
首先,这是我的代码
-(NSString *)UTF8StringFromData:(NSData *)theData{
Byte *arr = [theData bytes];
NSUInteger begin1 = [self findIndexOf:@"<li>" bArr:arr size:[theData length]]+4;
NSUInteger end1 = [self findIndexOf:@"</li></ol>" bArr:arr size:[theData length]];
Byte *arr1 = (Byte *)malloc(sizeof(Byte)*((end1-begin1+1)));
int j = 0;
for (int i = begin1; i < end1; i++){
arr1[j] = arr[i];
j++;
}
arr1[j]='\0';
NSData *temp = [NSData dataWithBytes:arr1 length:j];
return [[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding];
}
和第二 - 我从网上获取文件内容 - 所以我无法确定任何事情。这是一个谷歌翻译的HTML,如果它有帮助......