您的位置:首页 > 其它

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

2017-06-07 14:21 375 查看
方法:-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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编码 nsstring utf-8 nsdata
相关文章推荐