簡體   English   中英

由於某些字符,NSData到NSString的轉換失敗

[英]Conversion of NSData to NSString fails due to some charecters

我正在使用以下方法將NSData轉換為作為URL響應得到的NSString

NSString *result = [[NSString alloc] initWithData:_Data encoding:NSUTF8StringEncoding];

它工作正常,我已經使用了很長時間,但是今天在一頁加載數據(分頁)時遇到一個問題,我的結果給出了null字符串。

因此,我搜索了SO,並找到了從此鏈接NSData到NSString轉換問題的方法!

[NSString stringWithCString:[theData bytes] length:[theData length]];

而且效果很好。

我的查詢

  1. 該方法已在iOS 2.0中棄用。 如果使用此功能,將來是否會遇到任何問題?
  2. 我認為這是使方法失敗的文字 在此處輸入圖片說明 這是什么,有什么辦法可以使用NSUTF8StringEncoding對此進行編碼?
  3. 如上圖所示,我可以用來編碼所有類型的字符的替代編碼是什么?

為了獲得服務器發送的Content-Type ,您需要檢查響應的Content-Type標頭。

內容類型的值指定“ MIMI類型”,例如:

Content-Type: text/plain

Content-Type的值可以另外指定字符編碼,例如:

Content-Type: text/plain; charset=utf-8

每種MIME類型都應定義一個“默認”字符集,該字符集將在未指定任何字符集參數的情況下使用。

對於text/*媒體類型,默認字符集為US-ASCII。 (請參閱RFC 6657,§3 )。

以下代碼段演示了如何安全地編碼響應的正文

    - (NSString*) bodyString {
        CFStringEncoding cfEncoding = NSASCIIStringEncoding;
        NSString* textEncodingName = self.response.textEncodingName;
        if (textEncodingName) {
            cfEncoding = CFStringConvertIANACharSetNameToEncoding( (__bridge CFStringRef)(textEncodingName) );
        }
        if (cfEncoding != kCFStringEncodingInvalidId) {
            NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
            return [[NSString alloc] initWithData:self.body encoding:encoding];
        }        
        else {
            return [self.body description];
        }
    }

注意:

body是一個屬性,該屬性返回表示響應數據的NSData對象。

response是返回NSHTTPURLResponse對象的屬性。

如果

NSString *result = [[NSString alloc] initWithData:_Data encoding:NSUTF8StringEncoding];

返回nil_Data不包含UTF-8編碼的有效字符串。

你之前這么說

[NSString stringWithCString:[theData bytes] length:[theData length]];

在您的情況下效果很好。 此方法解釋的數據字節中的“默認的C字符串編碼”,但它是未指定的,其編碼是(並且因此該方法已不並且應當被使用)。

認為默認的C字符串編碼仍然是“ Mac Roman”。 在這種情況下

NSString *result = [[NSString alloc] initWithData:_Data encoding:NSMacOSRomanStringEncoding];

將是正確的解決方案。 但是無論如何,您都應該找出Web服務用於響應的編碼,並在initWithData:encoding:方法中進行指定。

嘗試這個

NSString *theString = [NSString stringWithFormat:@"To be continued%C", ellipsis];

NSData *asciiData = [theString dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

NSString *asciiString = [[NSString alloc] initWithData:asciiData encoding:NSASCIIStringEncoding];

NSLog(@"Original: %@ (length %d)", theString, [theString length]);
NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]);

這是由於字符串編碼不正確所致。 你可以試試:

  1. 使用dataPathNSData保存到磁盤
  2. 使用NSString類方法創建字符串:
+ (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error

注意這里:

ENC

返回時,如果成功讀取url,則包含用於解釋數據的編碼。

因此,如果方法成功,則可以獲取正確的字符串,並且所有操作均由iOS完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM