5

HTMLファイルをNSDataとして取得しており、その一部を抽出する必要があります。そのためには、UTF8エンコーディングを使用してNSStringに変換する必要があります。問題は、おそらくNSDataにUTF8に対して無効なバイトが含まれているために、この変換が失敗することです。データのバイト配列を取得して調べようとしましたが、ASCII以外の文字(ヘブライ文字など)に出くわすたびにジブリッシュになります。

ヘルプをいただければ幸いです。

アップデート:

ゴードンへ-次のように生成されたNSData:

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

私が変換が失敗すると言うとき、私はそれを意味します

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

nilを返します

エドへ-これが私のコードです(NSDataからバイト配列を取得し、必要なものを見つけて、そこから別のバイト配列を構築しました-それを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

4 に答える 4

6

これは古いトピックですが、今日解決策を探していたときに思いついたものです。私は今それを解決したので、解決策を探しているこのページに出くわすかもしれない他の人のためにそれを投稿しています。

非同期リクエストで行うことは次のとおりです。

私は最初にconnection:didReceiveResponseを使用してテキストエンコーディング名を保存します

encodingName = [[NSString alloc] initWithString:[response textEncodingName]];

その後、connectionDidFinishLoadingメソッドで使用しました

NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding((CFStringRef) encodingName));
NSString *payloadAsString = [[NSString alloc] initWithData:receivedData encoding:encoding];
于 2010-06-08T17:42:35.013 に答える
0

Gordon へ - そのように生成された NSData:

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

変換が失敗すると言うとき、それはつまり

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

ゼロを返します

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];

}

于 2009-09-12T17:46:39.947 に答える