NSData для NSString проблема разговора! - PullRequest
6 голосов
/ 11 сентября 2009

Я получаю html-файл как NSData, и мне нужно разобрать его, чтобы извлечь некоторую информацию. Мой подход состоял в том, чтобы преобразовать его в NSString с кодировкой UTF8 (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];
}

Ответы [ 3 ]

11 голосов
/ 14 октября 2009

Предположим, вы получили ответ 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 голос
/ 28 августа 2015

Я в ответ на поток Мартейн, приведенный выше, здесь, как я не мог читаемый фрагмент кода в комментариях.

Я обнаружил, что если на сервере тип содержимого ответа установлен на «text / plain», то (__bridge CFStringRef) [response textEncodingName] будет иметь значение null, и если вы попытаетесь передать его в CFStringConvertIANACharSetNameToEncoding, вы получите EXC_BAD_ACCESS сигнал.

Если тип содержимого ответа установлен на «текст / html; кодировка = UTF-8' , то все работает, как ожидалось. Для того, чтобы справиться с «текст / обычный» тип содержимого, это то, что я сделал:

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

0 голосов
/ 11 сентября 2009

Прежде всего, вот мой код

-(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-перевод Google, если это поможет ...

...