首页 > 其他分享 >Objective-c NSData转NSString后为nil 的解决办法

Objective-c NSData转NSString后为nil 的解决办法

时间:2022-12-13 12:01:47浏览次数:55  
标签:iconv nil encoding char NSString NSData Objective data


Apple官方的文档:


​Return Value​



​An NSString object initialized by converting the bytes ​​ ​​in​​  ​​data into Unicode characters using encoding. The returned object may be different from the original receiver. Returns nil ​​ ​​if​​  ​​the initialization fails ​​ ​​for​​  ​​some reason (​​ ​​for​​  ​​example ​​ ​​if​​  ​​data does not represent valid data ​​ ​​for​​  ​​encoding).​




​Return Value​



​An NSString object initialized by converting the bytes ​​​ ​​​in​​​  ​​​data into Unicode characters using encoding. The returned object may be different from the original receiver. Returns nil ​​​ ​​​if​​​  ​​​the initialization fails ​​​ ​​​for​​​  ​​​some reason (​​​ ​​​for​​​  ​​​example ​​​ ​​​if​​​  ​​​data does not represent valid data ​​​ ​​​for​​​  ​​​encoding).​




返回nil很可能是编码问题, 有可能你的页面里混入了非utf8的字符

解决办法: 

用libiconv清除非utf8字符

先给项目Link Binaries With Library 添加libiconv.dylib

#include "iconv.h"

- (NSData *)cleanUTF8:(NSData *)data {
iconv_t cd = iconv_open("UTF-8", "UTF-8"); // 从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;
if (iconv(cd, &inbuf, &inbytesleft, &outptr, &outbytesleft)
== (size_t)-1) {
NSLog(@"this should not happen, seriously");
return nil;
}
NSData *result = [NSData dataWithBytes:outbuf length:data.length - outbytesleft];
iconv_close(cd);
free(outbuf);
return result;
}



标签:iconv,nil,encoding,char,NSString,NSData,Objective,data
From: https://blog.51cto.com/u_512327/5933775

相关文章

  • GitHub前50名的Objective-C动画相关库相关推荐,请自行研究
    GitHub的Objective-C的动画UI库其实是最多的一部分,GitHub有相当一部分的动画大牛,如JonathanGeorge,NickLockwood,Kevin,RomanEfimov,ChristopherWendel,JaredVerdi,PeterSte......
  • OC之【NSString字符串的其他用法】
    #import<Foundation/Foundation.h>字符串的大小写处理voidNSString*str=@"GuangDong";//转成大写NSLog(@"大写:%@",[struppercaseString]);//转成小......
  • Objective-C #define 用法
    在C语言中,预处理代码(Preprocessor)是非常强大的工具,能让你的代码变得更加易读和易改。利用预处理代码,你可以重新定义代码的一部分,使得你的代码更适合你的风格。预处理......
  • OC之【objective-c中结构体】
    #import<Foundation/Foundation.h>void//定义了Date这种结构体类型structintintint};//定义结构体变量structDated={2013,4,5};day=6;}voi......
  • Objective-C 内存管理
        大概是因为Objective-C是C的超集,所以Objective-C也使用alloc来申请内存,不同的是C调用free来直接释放内存,而Objective-C不直接调用dealloc来释放内存。整个Obje......
  • Objective-C语法property详解
    1、简介: property是Objective-C的关键词,与@synthesize配对使用,用来让编译好器自动生成与数据成员同名的方法声明。@synthesize则是用来生成对应声明方法的实现。 1.1prop......
  • Objective-C语法之KVC的使用
    除了一般的赋值和取值的方法,我们还可以用Key-Value-Coding(KVC)键值编码来访问你要存取的类的属性。下图来自苹果官网: 如何使用KVC存取对象属性呢?看个示例1、使用KVC定义......
  • [XState] Create Actor in Vanilla Javascript
     functioncountBehavior(state,event){if(event.type==="INC"){return{...state,count:state.count+1}}}functioncreateA......
  • [第三篇]object c中的tostring和构造与NSString格式化
    对象的​​description​​​方法类似java的​​toString​​方法重写构造似乎自定义了构造并不影响默认构造的使用.也就是定义了之后还是可以再次定义.objectc的对象判断......
  • MDH 前端周刊第 77 期:布局动画、Arrow JS、vanilla-extract、antd 5、dumi 2
    MDH前端周刊第77期:布局动画、ArrowJS、vanilla-extract、antd5、dumi2原创 云谦 云谦和他的朋友们 2022-11-2109:25 发表于浙江收录于合集#MDH:前端周刊81个......