Iphone NSData到NString的转换问题

Iphone NSData到NString的转换问题,iphone,encoding,utf-8,nsstring,nsdata,Iphone,Encoding,Utf 8,Nsstring,Nsdata,我得到一个HTML文件作为NSData,需要提取其中的一些部分。为此,我需要使用UTF8编码将其转换为NSString。问题是这种转换失败,可能是因为NSData包含的字节对UTF8无效。我试图获取数据的字节数组并对其进行检查,但每次遇到非ASCII字符(例如希伯来文字母)时,我都会得到jibrish 我们将不胜感激 更新: 致Gordon-生成的数据如下: NSData *theData = [NSURLConnection sendSynchronousRequest:theRequ

我得到一个HTML文件作为NSData,需要提取其中的一些部分。为此,我需要使用UTF8编码将其转换为NSString。问题是这种转换失败,可能是因为NSData包含的字节对UTF8无效。我试图获取数据的字节数组并对其进行检查,但每次遇到非ASCII字符(例如希伯来文字母)时,我都会得到jibrish

我们将不胜感激

更新:


致Gordon-生成的数据如下:

    NSData *theData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&theResponse error:&theError];
    NSData *theData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&theResponse error:&theError];
当我说转换失败时,我的意思是

[[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding]
[[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding]
返回零

对Ed来说,这是我的代码(我从NSData获得了字节数组,找到了我需要的,并由此构造了另一个字节数组-将其转换为NSData,然后尝试将其转换为NSString…听起来有点复杂…)

-(NSString*)UTF8StringFromData:(NSData*)数据{
字节*arr=[数据字节];
NSUInteger begin1=[self-findIndexOf:@“
  • ”bArr:arr size:[数据长度]]+4; NSU整数end1=[self-findIndexOf:@“
  • ”BAR:arr大小:[数据长度]]; 字节*arr1=(字节*)malloc(大小(字节)*((end1-begin1+1)); NSLog(@“%d%d”,起始于1,结束于1); int j=0; for(int i=begin1;i

    }

    致Gordon-NSData的生成方式如下:

        NSData *theData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&theResponse error:&theError];
    
        NSData *theData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&theResponse error:&theError];
    
    当我说转换失败时,我的意思是

    [[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding]
    
    [[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding]
    
    返回零

    对Ed来说,这是我的代码(我从NSData获得了字节数组,找到了我需要的,并由此构造了另一个字节数组-将其转换为NSData,然后尝试将其转换为NSString…听起来有点复杂…)

    -(NSString*)UTF8StringFromData:(NSData*)数据{
    字节*arr=[数据字节];
    NSUInteger begin1=[self-findIndexOf:@“
  • ”bArr:arr size:[数据长度]]+4; NSU整数end1=[self-findIndexOf:@“
  • ”BAR:arr大小:[数据长度]]; 字节*arr1=(字节*)malloc(大小(字节)*((end1-begin1+1)); NSLog(@“%d%d”,起始于1,结束于1); int j=0; for(int i=begin1;i

    }

    您是否检查了HTTP头和/或文档本身中的字符集=?转换失败的最可能原因是字节不代表有效的UTF-8字符串。

    我不确定您是否意识到,在将数组放入新的
    NSData
    对象之前,您实际上不需要将其复制到另一个数组

    -(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 = arr + begin1;
      NSData *temp = [NSData dataWithBytes:arr1 length:end1 - begin1];
      return [[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding];
    }
    
    使用您的代码,它应该打印出您试图获取的字符串。(根据我上面给出的代码,它不会在之后停止。它只会继续运行)


    如果结果不是您期望的,那么数据可能有问题,或者您的
    begin1
    end1
    边界可能有问题。

    我知道这是一个老话题,但它是在我今天寻找解决方案时提出来的。我现在已经解决了这个问题,所以我只是把它发布给其他可能会在这个页面上寻找解决方案的人

    以下是我在异步请求中的操作:

    我首先将文本编码名称存储在connection:didReceiveResponse中,使用

    encodingName = [[NSString alloc] initWithString:[response textEncodingName]];
    
    后来在我的ConnectiondFinishLoading方法中,我使用了

    NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef) encodingName));
    NSString *payloadAsString = [[NSString alloc] initWithData:receivedData encoding:encoding];
    

    这些数据是如何生成的?现在的问题似乎是源代码中存在混合编码。另外,当你说转换失败时,你的确切意思是什么?您是否收到错误、垃圾输出或其他信息?听起来您做得不错。张贴代码以便验证。我已将此信息移至问题,答案中不应包含此信息。我检查了-它是UTF8。你会怎么做?