-initWithData: encoding:返回nil的解决办法

来源:互联网 发布:ubuntu mendelay 编辑:程序博客网 时间:2024/05/22 23:56

方法:-initWithData: encoding: 是将一个NSData对象转换为NSString对象。
有时候,NSData非空,该方法却返回一个nil,而不是返回一个NSString对象。
究其原因,无非是NSData中含有非UTF-8编码的字符,导致转换失败。
下面给出一个解决办法:

首先导入libiconv.tdb库

#import <iconv.h>static NSData *ALUTF8NSData(NSData *data) {    if (!data) return nil;    const char *iconv_utf8_encoding = "UTF-8";    iconv_t cd = iconv_open(iconv_utf8_encoding, iconv_utf8_encoding); // 从utf8转utf8    int one = 1;    iconvctl(cd, ICONV_SET_DISCARD_ILSEQ, &one); // 丢弃不正确的字符    size_t inbytesleft, outbytesleft;    inbytesleft = outbytesleft = data.length;    char *inbuf  = (char *)data.bytes;    char *outbuf = malloc(sizeof(char) * data.length);    char *outptr = outbuf;    size_t icon = iconv(cd, &inbuf, &inbytesleft, &outptr, &outbytesleft);    if (icon == 0) {        NSData *result = [NSData dataWithBytes:outbuf length:data.length - outbytesleft];        iconv_close(cd);        free(outbuf);        return result;    }    return nil;}

NSData转NSString示例:

NSData *data = /***/;NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];        if (!dataString) { // 解决NSData转化为NSString时,可能返回nil的情况            NSData *data = ALUTF8NSData(nsData);            dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];        }
阅读全文
0 0
原创粉丝点击