NSData到NSstring的转换问题

时间:2009-09-12 12:48:27

标签: iphone encoding utf-8 nsstring nsdata

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

帮助将不胜感激。

更新:

对戈登 - NSData生成如下:

    NSData *theData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&theResponse error:&theError];

当我说转换失败时,我的意思是

[[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding]

返回nil

To Ed - 这是我的代码(我从NSData获得了Byte数组,找到了我需要的东西,并从中构造了另一个Byte数组 - 将其转换为NSData然后尝试将其转换为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)));
NSLog(@"%d %d",begin1, end1);
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 个答案:

答案 0 :(得分:6)

我知道这是一个古老的话题,但是当我今天寻找解决方案时,它就出现了。我现在已经解决了,所以我只是将其发布给可能会遇到此页面寻找解决方案的其他人。

这是我在异步请求中所做的事情:

我首先使用

将文本编码名称存储在connection:didReceiveResponse中
encodingName = [[NSString alloc] initWithString:[response textEncodingName]];

然后在我使用的connectionDidFinishLoading方法中

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

答案 1 :(得分:0)

对戈登 - NSData生成如下:

    NSData *theData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&theResponse error:&theError];

当我说转换失败时,我的意思是

[[NSString alloc] initWithData:temp encoding:NSUTF8StringEncoding]

返回nil

To Ed - 这是我的代码(我从NSData获得了Byte数组,找到了我需要的东西,并从中构造了另一个Byte数组 - 将其转换为NSData然后尝试将其转换为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)));
NSLog(@"%d %d",begin1, end1);
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];

}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我不确定你是否知道,在将数组放入新的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];
}

至于您的特定问题,我会尝试使用调试器手动查看数据。在获得数组(arr1)后设置断点。当你点击它时,打开GDB控制台并试试这个:

print (char *)arr1

使用您的代码,它应该打印出您想要获得的字符串。 (根据我上面给出的代码,它不会在之后停止。它会继续前进。)

如果结果不符合您的预期,那么数据就会出现问题,或者可能与您的begin1end1边界有关。