iOS 修改需要转义的字符串

除Json字符串外,常用的特殊字符串处理。

特殊情况举例

当我要向H5发送数据时:

NSString *message = @"
'这是一段测试文字'
"; NSString *jsText = [NSString stringWithFormat:@"setContents('%@')", message]; [self.webView evaluateJavaScript:jsText completionHandler:^(id _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"%@",error); } else { NSLog(@"%@",error); } }];

此时会发生JavaScript异常

发生JavaScript异常

是因为需要传值的字符串中和JavaScript的中的单引号冲突,H5无法识别,此时我们需要对这类的字符串进行转义操作。

转义

手动查找并转义

一般情况下Objective-C
英文单引号正常可以写成@"'"
英文双引号正常可以写成@"""
但是,普通字符串的转义是无法像JSON那样去转义的,所以就需要替换字符串。

踩坑

找到需要转义的'",分别替换为\\'\\"
此处必须写成双反斜杠,不然编译器或者系统会认为此处是转义,会自动去掉单反斜杠
正确的写法:

NSString *message = @"
\\'这是一段测试文字\\'
";
正确的转义打印

错误的写法:

NSString *message = @"
\'这是一段测试文字\'
";
错误的转义打印

上面是手动转义,是直接在文本上进行转义。

代码转义

普通文本中可能存在多个特殊字符,此时需要遍历字符串,查找每个字符进行匹配后修改。

NSString *specialString = @"'";
NSString *replaceText = @"\\'";
NSMutableString *message = [[NSMutableString alloc] initWithString:@"
'这是一段测试文字'
'这是一段测试文字'
'这是一段测试文字'
"]; // 判断message中是否包含单引号 if ([message localizedStandardContainsString:specialString]) { // 效果等同于[message containsString:specialString] // 遍历所有字符串 [message enumerateSubstringsInRange:NSMakeRange(0, message.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) { if ([substring isEqualToString:specialString]) { // 转义特殊字符串 [message replaceOccurrencesOfString:substring withString:replaceText options:NSLiteralSearch range:enclosingRange]; } }]; }

完整的示例代码:

NSString *specialString = @"'";
NSString *replaceText = @"\\'";
NSMutableString *message = [[NSMutableString alloc] initWithString:@"
'这是一段测试文字'
'这是一段测试文字'
'这是一段测试文字'
"]; // 判断message中是否包含单引号 if ([message localizedStandardContainsString:specialString]) { // 效果等同于[message containsString:specialString] // 遍历所有字符串 [message enumerateSubstringsInRange:NSMakeRange(0, message.length) options:NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString * _Nullable substring, NSRange substringRange, NSRange enclosingRange, BOOL * _Nonnull stop) { if ([substring isEqualToString:specialString]) { // 转义特殊字符串 [message replaceOccurrencesOfString:substring withString:replaceText options:NSLiteralSearch range:enclosingRange]; } }]; } NSString *jsText = [NSString stringWithFormat:@"setContents('%@')", message]; [self.webView evaluateJavaScript:jsText completionHandler:^(id _Nullable response, NSError * _Nullable error) { if (error) { NSLog(@"%@",error); } else { NSLog(@"%@",response); } }];

展示最终结果


最终的js文本

你可能感兴趣的:(iOS 修改需要转义的字符串)