[英]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]];
而且效果很好。
我的查詢
NSUTF8StringEncoding
對此進行編碼? 為了獲得服務器發送的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]);
這是由於字符串編碼不正確所致。 你可以試試:
dataPath
將NSData
保存到磁盤 NSString
類方法創建字符串: + (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error
注意這里:
ENC
返回時,如果成功讀取url,則包含用於解釋數據的編碼。
因此,如果方法成功,則可以獲取正確的字符串,並且所有操作均由iOS完成。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.