initwithbytes 和 stringWithUTF8String的区别

本文探讨了在处理中文富文本时使用CXAHyperlinkLabel导致崩溃的原因,并解释了两个NSString方法的区别,即stringWithUTF8String: 和 initWithBytes:length:encoding:,最后提供了在获取网络数据时避免崩溃的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在项目中用到富文本的link问题时,用到了CXAHyperlinkLabel。但是在文本内容是中文时发现会崩溃,最终定位到是在HtmlParser解析时,在_characters里面获取对应的字符串是崩溃的。

NSString *string = [NSString stringWithUTF8String:(char *)ch];


返回的string居然为空,也就是转换出了错。一开始以为是编码的问题,但后来发现要是把

[NSString stringWithUTF8String:(char *)ch];
换为:
[[NSString alloc] initWithBytes:ch length:len encoding:NSUTF8StringEncoding]

就没问题了,甚是奇怪,那么这个两个方法到底有什么区别呢?在网上找到了类似问题的答案

+stringWithUTF8String: will assume that its input is a NUL-terminated string, 
but NSData doesn't put any particular terminator there. 
Instead,create your string using -initWithBytes:length:encoding: since you know the length of the data.

这是在获取网络数据data时会遇到的问题。

stringWithUTF8String 他假设的输入流是个以Nul 结束的字符串。
在字符串结尾系统自动加上的‘\0’,以让系统识别出一个字符串的结尾。

所以,对于流式的数据还是不要用stringWithUTF8String了。

转载于:https://my.oschina.net/michael1986/blog/304280

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值