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

方法:-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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值