rangeOfString 失效了

本文深入解析了NSString在查找字符串时遇到的问题,特别是当涉及到Unicode编码时的奥秘。通过一个实际的例子,揭示了为何在字符串中查找特定字符时会出现找不到的情况,并解释了这是由于Unicode编码中的合成字符导致的。同时,文章强调了使用NSString API时,务必携带option参数的重要性,以避免因编码问题引发的crash。最后,提供了关于NSString与Unicode的深入研究链接,帮助开发者更全面地理解相关知识。

前言:

NSString是大家最常用的一个类,几乎人人都脱离不开,它的功能非常强大,但是它其中有点奥秘直到碰到了才发现。

正文:

NSString的API中有一个rangeOfString:,这个也是大家常用的在字符串中查找的的Api。我一般图省事,都是用这个,很少用rangeOfString:option:

正是因为偷懒,才导致了我一个crash,真是记忆深刻。

下面,我先举一个例子:
1.png

明明有一个":",结果就是找不到.这样导致了我以后代码出现的crash。这次不是说这个crash,而是要找到原因,为啥这个":",找不到呢。
2.png

打印一下length,竟然是2。那为啥找不到呢.换一种方式:
3.png

找到了!!!!!

问题解决了,但是为啥会这样呢?

这个就得看看Unicode的构成了。

Unicode对于组成有两种形式:合成形式与分解形式。

而NSString的rangeOfString,这个api对此的支持是这样的。rangeOfString,默认不是按照码元来查找的,也就是不是按照literalSearch.虽然它里面包含":",但是,这两个字符可以合成另一个与其等价的字符,所以就找不到了。

合成字符有的在Unicode字符表中有对应的形式,有的没有。我举得例子就没有。这得根据各种字符的具体规则定义,比如字符+西里尔字母,就能组出很多种奇怪的字符。

提醒:

如果要在NSString查找字符,一定要带上option。因为NSString与Unicode还是有很多坑的。

最后,推荐几篇写的比较好的文章,介绍NSString与Unicode的。

http://objccn.io/issue-9-1/

http://blog.swanspace.org/ramble_unicode/

### 将Objective-C代码逐步转换为ArkTS语法 以下是将Objective-C代码逐步转换为ArkTS的过程说明以及具体实现方法: #### Objective-C原始代码分析 假设提供的Objective-C代码如下所示: ```objective-c NSString *urlString = @"https://example.com/content/12345"; NSRange range = [urlString rangeOfString:@"/content/" options:NSBackwardsSearch]; if (range.location != NSNotFound) { NSString *idString = [urlString substringFromIndex:range.location + range.length]; NSLog(@"Content ID: %@", idString); } ``` 这段代码的功能是从给定的URL字符串中提取`/content/`后面的内容ID。 --- #### ArkTS目标代码结构设计 为了完成相同功能,可以按照以下逻辑将其转换为ArkTS代码: 1. 使用正则表达式匹配特定模式。 2. 提取子串并返回所需部分。 3. 打印或存储结果。 以下是具体的转换过程和解释: --- #### 转换后的ArkTS代码 ```typescript let urlString: string = "https://example.com/content/12345"; // 定义正则表达式来匹配 "/content/" const regex = /\/content\//; // 查找匹配项的位置 const matchResult = urlString.match(regex); if (matchResult !== null && matchResult.index !== undefined) { const startIndex = matchResult.index + matchResult[0].length; const idString = urlString.substring(startIndex); // 获取剩余部分内容 console.log(`Content ID: ${idString}`); // 输出内容ID } else { console.error("No content ID found."); // 如果未找到,则报错 } ``` --- #### 关键点解析 1. **字符串处理差异** - 在Objective-C中,使用`rangeOfString:`方法查找子串位置[^1]。而在ArkTS中,可以通过正则表达式的`match()`函数获取索引位置。 2. **条件判断优化** - Objective-C中的`NSNotFound`常量被替换为JavaScript/TypeScript标准的`null`检查[^1]。 3. **日志输出方式** - `NSLog`在Objective-C中用于打印调试信息,在ArkTS中改用`console.log`作为替代方案[^1]。 4. **错误处理增强** - 原始Objective-C代码仅简单跳过无匹配情况;而ArkTS版本增加了更清晰的错误提示语句以提高可读性和健壮性[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值