由于某些字符,NSData到NSString的转换失败

时间:2013-10-11 08:20:40

标签: iphone ios objective-c encoding nsstring

我正在使用以下方法将NSData转换为NSString作为网址的回复。

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

它工作正常,我使用这个很长一段时间但今天我在一页加载数据(分页)时遇到了问题,我的结果给出了null字符串。

所以我搜索了SO并从这个链接NSData to NSString converstion problem!

找到了一个方法
[NSString stringWithCString:[theData bytes] length:[theData length]];

这很好。

我的疑问,

  1. 该方法在iOS 2.0中已弃用。如果我使用这个,我将来会面临任何问题吗?
  2. 我认为这是使该方法失败的文本enter image description here这是什么,有什么方法可以使用NSUTF8StringEncoding对此进行编码?
  3. 我可以使用哪种替代编码来编码所有类型的字符,如上图所示?

4 个答案:

答案 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)

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

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

    请注意:

      

    ENC

         

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

    因此,如果方法成功,您可以获得正确的字符串,所有这些都由iOS完成。