6

我得到一个作为 NSData 的 html 文件,需要对其进行解析以提取一些信息。我的方法是使用 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];
}
4

3 回答 3

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];
于 2009-10-14T14:43:32.927 回答
1

我在这里回复了上面的 Martijn Thé 线程,因为我无法在评论中放置可读的代码片段。

我发现如果在服务器上,响应内容类型设置为“text/plain”,那么 (__bridge CFStringRef) [response textEncodingName] 将为空,如果您尝试将其传递给 CFStringConvertIANACharSetNameToEncoding 您将收到 EXC_BAD_ACCESS 信号。

如果响应的内容类型设置为'text/html; charset=utf-8',然后一切都按预期工作。为了处理“文本/纯文本”内容类型,这就是我所做的:

CFStringRef sRef = (__bridge CFStringRef)[response textEncodingName];
if (sRef)
{
        CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding(sRef);
        encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
}
else
{
        encoding = NSASCIIStringEncoding;
}

于 2015-08-27T22:31:48.917 回答
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...

于 2009-09-11T08:58:35.680 回答