3

我正在使用以下方法转换NSDataNSString我作为 url 的响应得到的。

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. 我可以使用什么替代编码来编码上面图片中的所有类型的字符?
4

4 回答 4

4

为了获取服务器发送的内容的类型,您需要检查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对象的属性。

于 2013-10-11T11:16:21.407 回答
2

如果

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: 方法中指定它。

于 2013-10-11T08:33:08.160 回答
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]);
于 2013-10-11T08:25:16.777 回答
0

这是由于不正确的字符串编码。你可以试试:

  1. 保存NSData到磁盘dataPath
  2. 使用NSString类方法创建字符串:
+ (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error

注意这里:

编码

返回时,如果 url 读取成功,则包含用于解释数据的编码。

因此,如果该方法成功,您可以获得正确的字符串,一切都由 iOS 完成。

于 2013-10-11T08:31:01.463 回答