我正在使用以下方法将NSData
转换为NSString
作为网址的回复。
NSString *result = [[NSString alloc] initWithData:_Data encoding:NSUTF8StringEncoding];
它工作正常,我使用这个很长一段时间但今天我在一页加载数据(分页)时遇到了问题,我的结果给出了null
字符串。
所以我搜索了SO并从这个链接NSData to NSString converstion problem!
找到了一个方法[NSString stringWithCString:[theData bytes] length:[theData length]];
这很好。
我的疑问,
NSUTF8StringEncoding
对此进行编码?答案 0 :(得分:4)
为了获取服务器发送的内容类型,您需要检查响应的Content-Type
标题。
内容类型的值指定“MIMI类型”,例如:
Content-Type: text/plain
Content-Type的值可以另外指定字符编码,例如:
Content-Type: text/plain; charset=utf-8
每个MIME类型应该定义“默认”字符集,在没有指定charset参数时使用。
对于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
对象的属性。
答案 1 :(得分:1)
如果
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:
中指定
方法
答案 2 :(得分:0)
试试这个
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]);
答案 3 :(得分:0)
这是由于不正确的字符串编码。 你可以尝试:
NSData
dataPath
保存到磁盘
NSString
类方法创建字符串:+ (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error
请注意:
ENC
返回后,如果成功读取url,则包含用于解释数据的编码。
因此,如果方法成功,您可以获得正确的字符串,所有这些都由iOS完成。